【问题标题】:Create list of lists iteratively迭代地创建列表列表
【发布时间】:2013-09-03 06:41:30
【问题描述】:

我有一个循环,每次创建三个对象时重复 100 次,例如:

a<-TRUE
b<-1:20
c<-matrix(data=NA,ncol=2,nrow=10)

在第一次迭代结束时,我将这些对象存储在一个列表中:

myList<-list(a,b,c)

在第二次迭代中,创建了新的 a bc,它们存储在同一个列表中,覆盖了之前的 abc

myList<-list(a,b,c)

我想将新的abc 添加到现有列表中,而不是覆盖列表。

可以在每次迭代时更新列表以避免覆盖它吗?

有人可以帮忙吗?

【问题讨论】:

  • 使用lapply()而不是循环。
  • 这是不可能的,因为它是一个包含 100 行代码的巨大模拟。该列表将存储整个模拟的结果
  • 所以?你仍然可以使用lapply
  • 你的意思是使用 lapply 在其中执行一堆其他的应用函数和循环?
  • @Rich Scriven 在这里回答了你的问题 URL:stackoverflow.com/questions/27153263/…

标签: r


【解决方案1】:

如果我理解这个问题,您希望有一个地方来存储您的 100 个列表。如果一开始就这样做;

myList<-vector("list",100)

您现在有一个包含 100 个插槽的空列表。在每个循环之后,将您的输出列表分配给正确的插槽。即对于第 34 次迭代,将输出放在 mylist[[34]] 中。 myList 中的每个条目本身就是您的结果列表。

【讨论】:

    【解决方案2】:

    试试这个:

    fun <- function() {
      #insert here as much code as you desire
      a<-TRUE
      b<-1:20
      c<-matrix(data=NA,ncol=2,nrow=10)
    
      list(a, b, c)
    } 
    
    replicate(100, fun(), simplify=FALSE)
    

    如果你的函数在某种程度上依赖于迭代,你应该改用lapply

    【讨论】:

    • 但问题是在每次迭代中之前的 a、b、c 都会被覆盖,所以我看不出这是如何解决问题的
    • 如果这不能满足您的需要,说明您没有充分解释您的问题。
    • 好吧,您的编辑并没有改变这样一个事实,即我的答案是您声称想要的。
    猜你喜欢
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 2017-02-10
    • 1970-01-01
    • 2012-10-11
    • 2021-07-20
    相关资源
    最近更新 更多