R - 为什么rep()似乎改变了列表的行为

时间:2013-06-01 18:07:14

标签: r list rep

当我开始预先初始化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中就是这种情况。不应该像通常那样列出创建一个功能齐全的列表而不是做类似于c()的事情吗?为什么用c()对值进行分组实际上解决了这里的问题?

感谢您的想法!


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

2 个答案:

答案 0 :(得分:4)

您使用rep(list(c(1, 2)), 4)获得的内容列表清单;它是一个数字向量列表。如果您真的想要列表,请尝试

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

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

你可以更好地理解 little 这一点,为什么它的工作方式与?rep的第一行performing exegesis on的工作方式相同:

  

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

换句话说,它承诺复制x内容,但不一定要复制x本身。 (这就是为什么第二个建议,由@flodel提供,有效 - 它使x成为一个列表,其中内容是一个列表 - 以及为什么基于矢量的{{1工作 - 列表的内容是一个向量。)

答案 1 :(得分: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