2016-07-28 60 views
5

最近我一直在做一些大型複雜列表的工作,並且我看到了一些令人驚訝的行爲(對我來說至少),主要是將名字分配給列表。一個簡單的例子: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循環的形式必須是不同於右手邊的工作;我會認爲這些應該是一樣的。有誰可以向我解釋這個嗎?

+2

我覺得像這樣,雖然細節有可能不正確的:當你運行'名字(filList [1])'你」實質上是在'names'函數創建的環境中創建一個新的元素列表。然後,您分配新名稱,該功能完成運行,並且您的新列表對象被銷燬。但是,當您運行'names(filList)[1]'時,您正在修改全局環境中存在的'filList'對象的名稱。 – dayne

+2

順便說一句,你可以在兩側使用相同的表單,比如'names(x)[1] = names(y)[1]' – Frank

+0

謝謝,dayne和Frank,作解釋。 – RobertMc

回答

8

第一種情況是正確的用法。在第二種情況下,您正在將filList[i]發送到names<-,它僅作爲臨時子集對象存在。

或者,你可以只是做一切與外循環:

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

我作爲評論給出的解釋是否正確? – dayne

+0

@dayne是的,它是一個不綁定到變量的獨立副本。 – James

+0

太棒了,謝謝你的回覆! – dayne