2017-04-09 110 views
0

将以下函数转换为并行处理的最佳方法是什么?平行随机生成

myapply <- function(n, FUN, ...) { 
    lapply(1:n, function(i) { FUN(...) }) 
} 

我需要运行它与其他函数用于随机生成,例如,

myapply(100, function(...) rnorm(100, ...), 1, 1) 

所以我需要它来正确处理随机种子。此外,我希望代码是便携式和平台无关的,所以parallel::mcapply不适用于我。我正在考虑foreachdoParalleldoRNG,但doRNG目前不适用于CRAN上的Windows,并且未更新三年!我认为parallel::parLapply,但我正确地做clusterExport有问题,因为我没有要导出的元素的封闭列表(我发现this implementationhere,但我希望更简单些)。

+0

您可能能够使用['future'](https://cran.r-project.org/web/packages/future /index.html)包:[NEWS](https://github.com/HenrikBengtsson/future/blob/1b93c3425e290971712c8f220f9a63ac67fdadc0/NEWS#L34-L44)文件讨论了使用并行RNG时的可重复性。 – r2evans

回答

1

future的包(我的作者)的future_lapply()功能提供了使用L'Ecuyer-CMRG RNG流,这也是什么parallel::mclapply()用途平行的RNG。它适用于所有操作系统,并且不管并行后端。

上的所有操作系统下工作,包括Windows:

myapply <- function(n, FUN, ...) { 
    future_lapply(1:n, function(i, ...) { 
    FUN(...) 
    }, ..., future.seed = TRUE) 
} 

library("future") 
plan(multiprocess) 

y <- myapply(100, function(...) rnorm(100, ...), mean = 1, sd = 1) 
+0

这真是太棒了!我听说过未来,但没有时间去熟悉它 - 似乎未来的时间已经到来:) – Tim