【问题标题】:Creating a list containing each step of a while loop创建一个包含 while 循环的每个步骤的列表
【发布时间】:2020-02-11 19:18:46
【问题描述】:

我运行了一个 while 循环来执行一些预测模型。我的问题是使用while 循环会在每一步中覆盖模型,只留下最后一次迭代的结果。但我想将每个步骤的模型保留在一个列表中。

这是一个简单的例子。

i <- 0
while(i < 5) {
 i <- i + 1
 my_model <- i
}

这里,my_model 只包含最后一步的i

my_model
5

如何创建一个包含每个步骤的my_model 对象的列表?所以我的预期输出是:

my_model_list <- list(1, 2, 3, 4, 5)

我需要像上面那样使用while 循环来实现这个预期的输出。到目前为止,我想出的只是使用assign 在每个步骤中创建对象。但我希望有更好的解决方案。

【问题讨论】:

  • 您真的需要while 循环吗?或者您可以使用例如replicate 来运行预测 n 次吗?这会给你一个包含所有预测结果的漂亮列表
  • @docendodiscimus 不幸的是,我不能在这里使用replicate,因为必须满足while循环的条件才能运行模型。我省略了实际代码以使其更简单。
  • 你看过?append吗?

标签: r list while-loop


【解决方案1】:

在这种情况下,使用apply 系列不是最简单的处理方式,如下所示:

my_model <- lapply(0:5,function(i){i})

这会产生一个列表,其中包括函数的结果,在本例中为i

编辑:这样做是否有效

fun.list <- function(my.i){
  my_model <- lapply(0:my.i,function(i){i})
  return(my_model)
}


i <- 0 
repeat{
  my_model <- fun.list(my.i=i)
  if (i > 4) break
  i <- i + 1
}

结果列表如下所示

>my_model
[[1]]
[1] 0

[[2]]
[1] 1

[[3]]
[1] 2

[[4]]
[1] 3

[[5]]
[1] 4

[[6]]
[1] 5

【讨论】:

  • 我需要运行一个 while 循环,因为在 while 循环的每一步中,一些对象都会发生变化,只有当 while 循环的条件仍然满足时,下一步才有意义。一旦条件不满足,(while)循环应该停止。
  • 也许你可以使用repeat 来中断对lapply 的调用,如果条件满足,你就可以摆脱while 循环。这是一个例子stackoverflow.com/questions/20507247/…
  • 另外,也许让 MWE 更像实际代码。目前,反映所需的解决方案显然太容易了。
  • @make MWE 更像实际代码:我不同意这里。有时人们会这样做,而其他人最终会理解(巨大的)代码,而不知道问题是什么。在我看来,应该提取实际问题并提出问题,而不是复制和粘贴一些代码。在我的例子中,我是运行线性模型还是逻辑回归并不重要,重要的是如何将 while 循环的每个步骤保存为列表的元素,这就是我所要求的。
  • 1up 有趣的答案如何在没有 while 循环的情况下解决它。
【解决方案2】:

来自@jay.sf 的评论帮助我从rlist 包中找到了按预期工作的list.append 函数。

以我的问题为例:

i <- 0
my_model <- list()
while(i < 5) {
  i <- i + 1
  my_model <- list.append(my_model, i) 
}

或者参考王志强的好例子:

i <- 0
my_model <- list()
while(i < 5) {
  i <- i + 1
  my_model <- list.append(my_model, lm(mpg ~ cyl, data = mtcars))
}

编辑

这两个答案都非常有希望,但它们对我不起作用,因为在每个 while 循环步骤中都会创建一个数据帧,显然这种方法不适用于数据帧。见这里:

my_model <- list()
my_model[1] <- data.frame(matrix(rnorm(10*10), ncol= 10))
str(my_model)
List of 1
 $ : num [1:10] -1.023 -0.548 -0.534 -1.444 2.471 ...

幸运的是,list.append 也可以在这里正常工作:

i <- 0
my_model <- list(NA)
while(i < 5) {
  i <- i + 1
  my_model <- list.append(my_model, data.frame(matrix(rnorm(10*10), ncol= 10)))
}

【讨论】:

    【解决方案3】:

    这个怎么样:

    my_model <- list()
    i <- 0
    while(i < 5) {
      i <- i + 1
      my_model[i] <- lm(mpg ~ cyl, data = mtcars)
    }
    

    【讨论】:

      【解决方案4】:

      初始化一个空列表,然后将每个输出放入其中。

      my_model = list()
      i <- 0
      while(i < 5) {
        i <- i + 1
        my_model[i] <- i
      }
      

      给出:

      > my_model
      [[1]]
      [1] 1
      
      [[2]]
      [1] 2
      
      [[3]]
      [1] 3
      
      [[4]]
      [1] 4
      
      [[5]]
      [1] 5
      

      【讨论】:

        猜你喜欢
        • 2018-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-24
        • 2010-11-10
        • 2020-01-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多