2012-10-05 44 views
5

我想創建一個列表具有以下(嵌套)結構:複製一個列表來創建一個列表中,列出了

l <- list() 
for(i in seq(5)) l[[i]] <- list(a=NA,b=NA) 
> str(l) 
List of 5 
$ :List of 2 
    ..$ a: logi NA 
    ..$ b: logi NA 
$ :List of 2 
    ..$ a: logi NA 
    ..$ b: logi NA 
$ :List of 2 
    ..$ a: logi NA 
    ..$ b: logi NA 
$ :List of 2 
    ..$ a: logi NA 
    ..$ b: logi NA 
$ :List of 2 
    ..$ a: logi NA 
    ..$ b: logi NA 

我想通過rep或類似做到這一點,因爲我創建一大堆空白列表,我將在後面填寫。(我知道我可以通過引用下一個索引來擴展列表,但在索引兩個深度時不起作用)。

我以爲rep爲此工作,但它似乎並沒有。 ?rep給出了下面的例子:

fred <- list(happy = 1:10, name = "squash") 
rep(fred, 5) 

將返回:

> str(rep(fred, 5)) 
List of 10 
$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10 
$ name : chr "squash" 
$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10 
$ name : chr "squash" 
$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10 
$ name : chr "squash" 
$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10 
$ name : chr "squash" 
$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10 
$ name : chr "squash" 

換句話說,它展平列表。

我也試過list(rep(fred,5)),這同樣失敗。

如何複製列表清單?

回答

8

我認爲這是與代表的行爲做的,你想窩在你面前代表:

rep(list(fred),5) 

str輸出:

List of 5 
$ :List of 2 
    ..$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10 
    ..$ name : chr "squash" 
$ :List of 2 
    ..$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10 
    ..$ name : chr "squash" 
$ :List of 2 
    ..$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10 
    ..$ name : chr "squash" 
$ :List of 2 
    ..$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10 
    ..$ name : chr "squash" 
$ :List of 2 
    ..$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10 
    ..$ name : chr "squash" 
+1

只是我還是那種可怕的非直覺?感謝您的解決方案。 –

+2

@ AriB.Friedman - 如果你比較'rep(1:2,5)'和'rep(list(1:2),5)',它可能更有意義,同時記住列表**真的是**一種矢量。這有幫助嗎? –

+0

@ JoshO'Brien是的,這確實是。 –

4

您可以使用replicate

l <- replicate(5, list(a=NA,b=NA), simplify=FALSE) 
+0

你知道一種複製現有對象結構的方法嗎?例如。我有一個列表,其中包含幾個嵌套級別,我想要一個空的版本來存儲結果,每個嵌套元素使用相同的名稱。也許有辦法從整個對象中刪除所有的_data_,只留下結構及其元素名稱? –

相關問題