将以下函数转换为并行处理的最佳方法是什么?
myapply <- function(n, FUN, ...) {
lapply(1:n, function(i) { FUN(...) })
}
我需要使用其他用于随机生成的函数来运行它,例如
myapply(100, function(...) rnorm(100, ...), 1, 1)
所以我需要它来正确处理随机种子。此外,我希望代码可移植且与平台无关,因此parallel::mcapply
对我不起作用。我正在考虑将foreach
与doParallel
和doRNG
一起考虑,但doRNG
目前无法在CRAN上用于Windows,并且三年内未更新!我考虑了parallel::parLapply
,但由于我没有要导出的元素的封闭列表(我找到this implementation或here,但我在正确执行clusterExport
时遇到问题,但我希望更简单的事情。)
答案 0 :(得分:1)
future包的future_lapply()
函数(我是作者)使用L'Ecuyer-CMRG RNG流提供并行RNG,这也是parallel::mclapply()
使用的。它在所有操作系统中都是一样的,无论是并行后端。
以下适用于所有操作系统,包括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)