2016-07-28 47 views
5

Ich habe in letzter Zeit mit großen, komplexen Listen gearbeitet, und ich habe ein Verhalten beobachtet, das (zumindest für mich) überraschend war, hauptsächlich mit der Zuweisung von Namen zu einer Liste. Ein einfaches Beispiel:Benennung von Listenelementen in 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 

aber:

for(i in 1:3){ 
    filList[i] <- Fil[i] 
    names(filList[i]) <- names(Fil[i]) 
} 
identical(Fil,filList) 
[1] FALSE 

denke ich, der Hauptgrund, es verwirrt mich, weil die Form der linken Seite der ersten names Linie in der ersten for-Schleife sein muss anders als auf der rechten Seite zu arbeiten; Ich hätte gedacht, dass diese gleich sein sollten. Kann mir bitte jemand das erklären?

+2

Ich denke, es wie folgt, obwohl die Details wahrscheinlich falsch sind: wenn Sie 'Namen laufen (filList [1])' Sie‘ Im Wesentlichen erstellen Sie eine neue Liste mit einem Element in der Umgebung, die mit der Funktion 'names' erstellt wurde. Dann weisen Sie den neuen Namen zu, die Funktion wird beendet und das neue Listenobjekt wird zerstört. Wenn Sie 'names (filList) [1]' ausführen, ändern Sie jedoch die Namen des Objekts 'filList', das in Ihrer globalen Umgebung vorhanden ist. – dayne

+2

Btw, Sie können das gleiche Formular auf beiden Seiten verwenden, wie 'Namen (x) [1] = Namen (y) [1]' – Frank

+0

Danke, Dayne und Frank, für die Erklärungen. – RobertMc

Antwort

8

Der erste Fall ist die korrekte Verwendung. Im zweiten Fall senden Sie filList[i] an names<-, die nur als temporäres Teilobjekt vorhanden ist.

Alternativ können Sie einfach alles außerhalb der Schleife tun mit:

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

Ist die Erklärung, die ich als Kommentar gegeben habe, korrekt? – dayne

+0

@dayne Ja, es ist eine separate Kopie, die nicht an eine Variable gebunden ist. – James

+0

Super, danke für die Antwort! – dayne

Verwandte Themen