为函数内的for循环的每次迭代创建单独的对象

时间:2017-07-29 20:39:25

标签: r function for-loop

我有一个函数,它包含一个迭代160次的for循环,在每次迭代后产生一个三维数组。我希望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
                   }

关于如何将数组保存为具有相应数字的对象的任何想法?谢谢!

1 个答案:

答案 0 :(得分:0)

来自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)在函数环境中创建变量 - 而不是全局环境,至少不是默认情况 - 其名称是{{1}的结果并且其值为paste0('array', i)(无论您创建什么数组)。您可以稍后使用value访问它,其中get(paste0('array', x))是您需要的数组编号。

了解更多有关功能环境的优秀资源是Hadley Wickham's book