2016-07-28 5 views
5

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?

+2

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

+2

Btw, vous pouvez utiliser la même forme des deux côtés, comme 'noms (x) [1] = noms (y) [1]' – Frank

+0

Merci, dayne et Frank, pour les explications. – RobertMc

Répondre

8

Le premier cas est l'utilisation correcte. Dans le second cas, vous envoyez filList[i] à names<- qui n'existe que sous la forme d'un objet sous-traité temporaire.

Alternativement, vous pouvez simplement faire tout en dehors de la boucle avec:

names(filList) <- names(Fil) 
+0

L'explication que j'ai donnée comme commentaire est-elle correcte? – dayne

+0

@dayne Oui, il s'agit d'une copie distincte qui n'est pas liée à une variable. – James

+0

Génial, merci pour la réponse! – dayne