最近我一直在做一些大型複雜列表的工作,並且我看到了一些令人驚訝的行爲(對我來說至少),主要是將名字分配給列表。一個簡單的例子: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
但:
for(i in 1:3){
filList[i] <- Fil[i]
names(filList[i]) <- names(Fil[i])
}
identical(Fil,filList)
[1] FALSE
我覺得它讓我困惑的主要原因是因爲在第一個第一names
線的左側for循環的形式必須是不同於右手邊的工作;我會認爲這些應該是一樣的。有誰可以向我解釋這個嗎?
我覺得像這樣,雖然細節有可能不正確的:當你運行'名字(filList [1])'你」實質上是在'names'函數創建的環境中創建一個新的元素列表。然後,您分配新名稱,該功能完成運行,並且您的新列表對象被銷燬。但是,當您運行'names(filList)[1]'時,您正在修改全局環境中存在的'filList'對象的名稱。 – dayne
順便說一句,你可以在兩側使用相同的表單,比如'names(x)[1] = names(y)[1]' – Frank
謝謝,dayne和Frank,作解釋。 – RobertMc