当我开始预先初始化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()实际上“忽略”第一个容器,但重复第二个容器。
答案 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