重复使用复制()或sapply用户定义的函数()(Repeating a user-defined

2019-08-08 01:35发布

我已经定义了一个自定义函数,就像这样:

my.fun = function() {

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

 return(output)

}

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

我需要做的就是重复功能,比如5倍,五个存储output结果到一个全新的矩阵,说final ,但没有使用其他的for循环 (这对于使代码更清晰,而且还因为在第二那一刻我想尝试并行这些额外的5个重复)。

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

我试图使用final <- replicate(5, my.fun())其正确地计算5次重复,但后来我不得不“手动”把元件至全新的5000×20矩阵..有一个更elgant方式这样做呢? (可能使用sapply() 非常感谢

Answer 1:

由于是代表你可能有三个维度的数组。 如果你想有一个列表,你会加入简化= FALSE。 试试这个:

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

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

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

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



Answer 2:

如果您要更换replicate与rlply从plyr包,您可以使用do.callrbind

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

如果你不想依赖plyr包,你总是可以这样做:

do.call(rbind, lapply(1:5, function(i) my.fun()))


Answer 3:

要看你用哪个包并行计算,但这里是我会怎么做(用它藏在一个循环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()


Answer 4:

试试这个:

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

你会得到“最终”结果在矩阵的形式。



文章来源: Repeating a user-defined function using replicate() or sapply()