【问题标题】:R - Why does rep() seemingly change behaviour of listsR - 为什么 rep() 似乎会改变列表的行为
【发布时间】:2013-05-28 08:39:26
【问题描述】:

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

【问题讨论】:

  • 我不太明白你的编辑,所以我认为你错了。 rep 没有什么好笑的:它复制了你给它的东西。只有您似乎忽略了list(1, 2)list(c(1, 2))list(list(1, 2)) 之间的区别。这确实是三个不同的对象。
  • 正如 Ben Bolker 在函数手册参考中指出的“rep 复制 x 中的值”:rep 获取给定列表/容器中的值并重复它们。我认为它只是简单地重复给定的列表/容器,因为它被输入到 rep() 函数中。所以实际上是 rep() 的工作方式让我不久前感到困惑,而不是列表或向量。

标签: r list rep


【解决方案1】:

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

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

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

performing exegesis on?rep 的第一行,你可以更好地理解 一点 为什么这样会起作用:

‘rep’复制‘x’中的值。

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

【讨论】:

  • 这是一个很好的提示如何获得一个真实的列表列表。然而,主要问题仍然存在:为什么 c(1, 2) 在这种特殊情况下会起作用,而 list(1, 2) 应该总是像在 rep() 中不使用它时那样创建一个列表。
  • 我现在选择了 Peytons 答案作为最终解决方案,但也感谢您完成您的答案。
【解决方案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

【讨论】:

  • 所以,基本上 rep 所做的是将所有重复的值组合到一个集合中。如果我只是重复示例中的 1 和 2 列表,它会将它们缝合在一起。但是,通过添加一个额外的容器层次结构,rep() 重复这些新容器及其内部的值,这可以解决问题,无论新容器是列表还是向量或类似功能的东西。谢谢,我想我终于明白了。
猜你喜欢
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
相关资源
最近更新 更多