10

我已经定义了一个自定义函数,如下所示:

my.fun = function() {

      for (i in 1:1000) {
      ...
        for (j in 1:20) {
          ...
        }
      }

 return(output)

}

它返回一个输出矩阵 ,output由 1000 行和 20 列组成。

我需要做的是重复函数说 5 次并将五个output结果存储到一个全新的矩阵final比如想尝试并行化这些额外的 5 次重复)。

因此final应该是一个具有 5000 行和 20 列的矩阵(这 5 次重复背后的基本原理是在我使用的两个 for 循环中,以及其他函数sample)。

我尝试使用final <- replicate(5, my.fun()),它正确计算了五次复制,但是我必须“手动”将元素放入一个全新的 5000 x 20 矩阵中。有没有更优雅的方法呢?(也许使用sapply()?)。非常感谢

4

4 回答 4

14

就目前而言,您可能有一个具有三个维度的数组。如果你想要一个列表,你会添加 simple=FALSE。试试这个:

do.call( rbind, replicate(5, my.fun(), simplify=FALSE ) )

或者你可以aperm在“final”仍然是一个数组的情况下使用:

fun <- function() matrix(1:10, 2,5)
final <- replicate( 2, fun() )
> final
, , 1

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

, , 2

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

> t( matrix(aperm(final, c(2,1,3)), 5,4) )
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10
[3,]    1    3    5    7    9
[4,]    2    4    6    8   10

可能有更经济的矩阵运算。我只是还没有发现一个。

于 2013-01-23T22:09:09.023 回答
7

如果你用replicate包中的rlply替换plyr,你可以使用do.callwith rbind

library(plyr)
do.call(rbind, rlply(5, my.fun()))

如果您不想依赖plyr软件包,您可以随时执行以下操作:

do.call(rbind, lapply(1:5, function(i) my.fun()))
于 2013-01-23T22:03:38.197 回答
7

取决于您用于并行计算的包,但我会这样做(使用 将其隐藏在循环中sapply,就像replicate)。

library(snowfall)
sfInit(parallel = TRUE, cpus = 4, type = "SOCK")
# sfExport() #export appropriate objects that will be needed inside a function, if applicable
# sfLibrary() #call to any special library
out <- sfSapply(1:5, fun = my.fun, simplify = FALSE)
sfStop()
于 2013-01-23T22:52:04.910 回答
0

试试这个:

final <- replicate(5, my.fun(), simplify = "matrix")

您将以矩阵的形式得到“最终”的结果。

于 2015-05-10T05:42:49.557 回答