【问题标题】:Creating a separate object for each iteration of for-loop within a function为函数内的每次循环迭代创建一个单独的对象
【发布时间】:2017-07-29 20:39:24
【问题描述】:

我有一个函数,其中包含一个迭代 160 次的 for 循环,每次迭代后都会生成一个 3 维数组。我希望for循环将每个数组分别保存为名称下的对象,例如array001array002array003等,最好不要将它们吐出到全局工作区。最后,我希望以后能够在同一个函数中调用其中的一些数组。

array.function <- function(df, parameter = 0) {
                      for (i in 1:160) {
                           DO A LOT OF STUFF
                           SAVE OUTPUT AS array###
                      }

                      DO MORE STUFF with arrays generated by for-loop above
                   }

关于如何将数组保存为名称中具有相应数字的对象有什么想法吗?谢谢!

【问题讨论】:

  • 将每个数组放入列表的单独元素中。然后返回列表。像myList[[i]] &lt;- array.function(df, i) 之类的东西。您可以使用paste myList[[paste0("array", i)]] &lt;- ... 添加名称。
  • 谢谢。尽管在这种情况下,我必须将数组附加到函数内部的列表中,然后在 for 循环完成填充列表后将列表元素索引到函数的下方。我假设这就是你的意思。

标签: r function for-loop


【解决方案1】:

lmo 的评论是一个很好的可行解决方案,用于存储数组并稍后在函数中访问它们。但是,如果您真的希望将它们存储为单独的变量而不是列表,assign()get() 是您的朋友:

array.function <- function(df, parameter = 0) {
  # This stores the function's environment for convenience:
  env <- environment()
  for ( i in 1:160 ) { # Then for each iteration
    # make an array and store it in the function's environment
    assign(paste0('array', i), array(c(i, 2:27), dim=c(3, 3, 3)))
  }
  # Then print out a randomly selected array to make sure it worked
  print(get(paste0('array', sample(1:160, 1))))
  # I don't know what you want to do with the arrays,
  # for now just return the whole function's environment
  # (the arrays as well as 'i', 'df', 'env', and 'parameter')
  return(as.list(sapply(ls(envir=env), get, envir=env)))
}

x <- array.function(1) # the 1 is just because I kept your arguments

, , 1

     [,1] [,2] [,3]
[1,]  158    4    7
[2,]    2    5    8
[3,]    3    6    9

, , 2

     [,1] [,2] [,3]
[1,]   10   13   16
[2,]   11   14   17
[3,]   12   15   18

, , 3

     [,1] [,2] [,3]
[1,]   19   22   25
[2,]   20   23   26
[3,]   21   24   27

对于循环的每次迭代,assign(paste0('array', i), value) 在函数的环境中创建一个变量——不是全局环境,至少默认情况下不是——其名称是 paste0('array', i) 的结果,其值为 value (无论您创建什么数组)。您可以稍后使用get(paste0('array', x)) 访问它,其中x 是您需要的数组编号。

了解更多关于函数环境的优秀资源是Hadley Wickham's book

【讨论】:

  • 谢谢,成功了!我最终没有使用环境设置,因为它被证明是多余的,就像你提到的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多