J'ai récemment travaillé sur de grandes listes complexes et j'ai observé des comportements surprenants (du moins pour moi), principalement liés à l'attribution de noms à une liste. Un exemple simple:Attribution d'un nom aux éléments de la liste dans R
Fil <- list(
a = list(A=seq(1, 5, 1), B=rnorm(5), C=runif(5)),
b = list(A="Cat", B=c("Dog", "Bird"), C=list("Squirrel", "Cheetah", "Lion")),
c = list(A=rep(TRUE, 5), B=rep(FALSE, 5), C=rep(NA, 5)))
filList <- list()
for(i in 1:3){
filList[i] <- Fil[i]
names(filList)[i] <- names(Fil[i])
}
identical(Fil,filList)
[1] TRUE
mais:
for(i in 1:3){
filList[i] <- Fil[i]
names(filList[i]) <- names(Fil[i])
}
identical(Fil,filList)
[1] FALSE
Je pense que la principale raison pour laquelle il me confond est parce que la forme du côté gauche de la première ligne names
dans la première pour les besoins de la boucle être différent de celui de droite pour travailler; J'aurais pensé que ceux-ci devraient être les mêmes. Est-ce que quelqu'un pourrait m'expliquer cela?
j'y pense comme ça, même si les détails sont probablement incorrects: lorsque vous exécutez 'noms (FILLIST [1])' vous » re créer essentiellement une nouvelle liste d'un élément dans l'environnement créé par la fonction 'names'. Ensuite, vous affectez le nouveau nom, la fonction se termine et votre nouvel objet liste est détruit. Cependant, lorsque vous exécutez 'names (filList) [1]' vous modifiez les noms de l'objet 'filList' qui existe dans votre environnement global. – dayne
Btw, vous pouvez utiliser la même forme des deux côtés, comme 'noms (x) [1] = noms (y) [1]' – Frank
Merci, dayne et Frank, pour les explications. – RobertMc