复制一个列表以创建一个嵌套列表

16

我正在尝试创建一个具有以下(嵌套)结构的列表:

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)),但同样失败了。
如何复制一个列表的列表?
2个回答

19

我认为这与声望行为有关,你需要在获得声望之前嵌套:

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
这是只有我觉得还不够直观吗?感谢您提供的解决方案。 - Ari B. Friedman
2
@AriB.Friedman -- 如果你将rep(1:2, 5)rep(list(1:2), 5)进行比较,同时记住列表确实是向量的一种类型,那么这可能更有意义。这样有帮助吗? - Josh O'Brien
@JoshO'Brien 是的,确实如此。 - Ari B. Friedman

5
您可以使用 replicate:
l <- replicate(5, list(a=NA,b=NA), simplify=FALSE)

1
你知道有没有一种方法可以复制现有对象的结构吗?例如,我有一个列表,其中包含多个嵌套级别,我想要一个空版本来存储结果,使用每个嵌套元素相同的名称。也许有一种方法可以删除整个对象中的所有_data_,只留下结构和其元素名称? - n1k31t4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接