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?
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
Btw, Sie können das gleiche Formular auf beiden Seiten verwenden, wie 'Namen (x) [1] = Namen (y) [1]' – Frank
Danke, Dayne und Frank, für die Erklärungen. – RobertMc