如何在R(循环)中向列表添加元素

Phi*_*emy 93 r

我想在循环中向列表添加元素(我不确切知道多少)

像这样:

l <- list();
while(...)
   l <- new_element(...);
Run Code Online (Sandbox Code Playgroud)

最后,l[1]将是我的第一个元素,l[2]我的第二个元素,依此类推.

你知道怎么办吗?

kon*_*vas 149

您不应该c在循环内部使用添加到列表中,因为这会导致代码非常慢.基本上,当您这样做时c(l, new_element),将复制列表的全部内容.而不是那样,您需要通过索引访问列表的元素.如果您知道列表的长度,最好使用它将其初始化为此大小l <- vector("list", N).如果不这样做,则可以将其初始化为长度等于某个大数(例如,如果迭代次数有上限),然后在循环结束后选择非NULL元素.无论如何,基本点是你应该有一个索引来跟踪列表元素并使用它来添加

i <- 1
while(...) {
    l[[i]] <- new_element
    i <- i + 1
}
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息,请查看Patrick Burns的The R Inferno(第2章).

  • 与 `python` 或 `scala` `for() yield` 生成器相比,这非常痛苦/冗长。将继续希望/寻找一些 R 结构,让我少做一些工作.. (12认同)

Jas*_*son 14

以下内容将元素添加到循环中的列表中.

l<-c()
i=1

while(i<100) {

    b<-i
    l<-c(l,b)
    i=i+1
}
Run Code Online (Sandbox Code Playgroud)

  • 代码中的列表在哪里?(即c()不是列表). (16认同)
  • 循环中`b < - i`的目的是什么? (10认同)
  • c()产生一个向量,而不是一个列表:这不会处理很多元素。如果您知道要填充多少个元素,内存在建立向量时效率也不高。 (5认同)
  • @DavidArenburg出于好奇 - 当你事先不知道列表的大小时,还有更好的方法吗? (4认同)
  • `c()`将合并数据帧.您将获得一个巨大的数据帧,而不是数据帧列表 (3认同)
  • 这似乎是关于vector的答案,而不是list() (2认同)