2011-12-19 47 views
2

通過cbind列表的列表假設我們想對存儲在列表中的元素,例如,R:不平整

> x <- list() 
> x[[1]] <- list(1,2) 
> x[[2]] <- list(3,4) 
> x 
[[1]] 
[[1]][[1]] 
[1] 1 

[[1]][[2]] 
[1] 2 


[[2]] 
[[2]][[1]] 
[1] 3 

[[2]][[2]] 
[1] 4 

如果想創建級聯同樣的事情,沒有明確提及的外部列表的指標,自然的方法(見編輯下面的動機,這種做法)是

> c(list(list(1,2)),list(3,4)) 
[[1]] 
[[1]][[1]] 
[1] 1 

[[1]][[2]] 
[1] 2 


[[2]] 
[1] 3 

[[3]] 
[1] 4 

有沒有辦法避免的第二個參數c()的「扁平化」,從而使用級聯產生x

編輯:我應該已經明確了我的預期應用。

最後,我希望在我經歷一個循環時每當找到一個對時,都會將對添加到列表中。目前,我維護主列表的索引,以便在找到一個新對時在其末尾添加新對,但使用c可能更自然。因此,使用明確的指標循環可能看起來像這樣

index <- 1 
l <- list() 
for (i in 1:10) { 
    for (j in (i+1):10) { 
     if ((i+j)%%2 == 0) { 
      l[[index]] <- list(i,j) 
      index <- index + 1 
     } 
    } 
} 

而失敗的嘗試使用c看起來像這樣

l <- list() 
for (i in 1:10) { 
    for (j in (i+1):10) { 
     if ((i+j)%%2 == 0) 
      l <- c(l,list(i,j)) 
    } 
} 

答:由湯米下面,一個額外的表(注意)需要,所以下面的作品:

l <- list() 
for (i in 1:10) { 
    for (j in (i+1):10) { 
     if ((i+j)%%2 == 0) 
      l <- c(l,list(list(i,j))) 
    } 
} 

有點顯而易見的事情,我應該想通了。湯米還指出,這可能不是一個很好的做事方式。

+0

不知道你在找什麼,但它是'c(list(1,2),list(3,4))'? – Ramnath 2011-12-19 04:53:27

+1

作爲一般性評論,如果您的實際問題與您的示例代碼相似,那麼將附加事項添加到列表末尾不太可能是正確的方法(正如您發現的那樣,如果R中存在尷尬)。當你遇到一個簡單的任務感到尷尬的時候,這是一個好兆頭,你沒有用這個語言的方式來解決你的問題。 – joran 2011-12-19 05:41:36

+1

很高興你解決了你的直接問題,我會重申我在下面說的:預分配。這個答案顯示了一些性能比較......它可以很容易地用更復雜的函數將氣泡上升到幾分鐘或幾小時。祝你好運! http://stackoverflow.com/questions/4034059/iteratively-constructed-dataframe-in-rx – Chase 2011-12-19 05:44:52

回答

3

我想簡單的答案是「不,你需要額外的列表()包裝」。

...但在一般情況下,最好是(更快/更少的內存)來使用索引值添加到預先分配的名單比使用c()

x <- NULL 
for(i in 1:2) x <- c(x, list(list(i,i+1))) 
x 

x <- vector('list', 2) 
for(i in seq_along(x)) x[[i]] <- list(i,i+1) 
x 

如果lapply可以使用,那就是通常效率更高:

lapply(1:2, function(i) list(i, i+1)) 
+0

謝謝,湯米! – 2011-12-19 05:41:06