1

当我开始预初始化 R 中的列表列表时,我想知道列表对象在用作 rep() 中的值时的行为。当我尝试以下...

listOfLists <- rep(list(1, 2), 4)

... listOfLists 是一个单一的列表:

1 2 1 2 1 2 1 2

但是,我会假设它是一个列表列表,其中最终包含值 1 和 2 :

1 2
1 2
1 2
1 2

为了获得所需的结果,我必须另外用 c() 包围值条目:

listOfLists <- rep(list(c(1, 2)), 4)

我想知道为什么在 R 中会出现这种情况。 list 不应该像通常那样创建一个功能齐全的列表,而不是做类似于 c() 的事情吗?为什么用 c() 对值进行分组实际上解决了这里的问题?

谢谢你的想法!


结论: Ben Bolker 和 Peyton 的帖子都给出了最终答案。这既不是 list()- 也不是 c()- 函数的行为。相反,rep() 似乎将列表和向量的条目合并为一个。用另一个容器包围这些值会使 rep() 实际上“忽略”第一个但重复第二个容器。

4

2 回答 2

4

您得到rep(list(c(1, 2)), 4)不是列表列表;它是一个数字向量列表。如果您真的想要列表列表,请尝试

replicate(4,list(1,2),simplify=FALSE)

或者

rep(list(list(1, 2)), 4)

通过在第一行执行解释,您可以更好地理解为什么它会这样工作:?rep

'rep' 复制了 'x' 中的值。

换句话说,它承诺复制 的内容x但不一定复制x自己。(这就是为什么由@flodel 提供的第二个建议起作用的原因——它形成x了一个列表,其内容是一个列表——以及为什么基于向量的rep()工作——列表的内容是一个向量。)

于 2013-06-01T18:11:01.503 回答
2

它确实创建了一个功能齐全的列表。不同之处在于,在您的第一个示例中,您创建了一个包含两个元素的列表,而在第二个示例中,您创建了一个包含一个元素的列表 - 一个向量。

当您组合列表时(例如,使用rep),您实际上是在创建一个包含先前列表的所有元素的新列表。那么,在第一个示例中,您将有八个元素,而在第二个示例中,您将有四个。

另一种查看方式:

> length(list(1, 2))
[1] 2
> c(list(1, 2), list(1, 2), list(1, 2))
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 1

[[4]]
[1] 2

[[5]]
[1] 1

[[6]]
[1] 2

> length(list(1:2))
[1] 1
> c(list(1:2), list(1:2), list(1:2))
[[1]]
[1] 1 2

[[2]]
[1] 1 2

[[3]]
[1] 1 2
于 2013-06-01T18:13:45.533 回答