我正在开发一个 R 包并尝试在其中使用并行处理来解决令人尴尬的并行问题。我想编写一个循环或函数来使用我包中的其他函数。我在 Windows 中工作,我尝试使用parallel::parLapply
and foreach::%dopar%
,但无法让工作人员(核心)访问我的包中的功能。这是一个包含两个函数的简单包的示例,其中第二个函数在并行循环中调用第一个函数%dopar%
:
add10 <- function(x) x + 10
slowadd <- function(m) {
cl <- parallel::makeCluster(parallel::detectCores() - 1)
doParallel::registerDoParallel(cl)
`%dopar%` <- foreach::`%dopar%` # so %dopar% doesn't need to be attached
foreach::foreach(i = 1:m) %dopar% {
Sys.sleep(1)
add10(i)
}
stopCluster(cl)
}
当我加载包devtools::load_all()
并调用slowadd
函数时,Error in { : task 1 failed - "could not find function "add10""
返回。
我还尝试使用我的包显式初始化工作人员:
add10 <- function(x) x + 10
slowadd <- function(m) {
cl <- parallel::makeCluster(parallel::detectCores() - 1)
doParallel::registerDoParallel(cl)
`%dopar%` <- foreach::`%dopar%` # so %dopar% doesn't need to be attached
foreach::foreach(i = 1:m, .packages = 'mypackage') %dopar% {
Sys.sleep(1)
add10(i)
}
stopCluster(cl)
}
但我得到了错误Error in e$fun(obj, substitute(ex), parent.frame(), e$data) : worker initialization failed: there is no package called 'mypackage'
。
如何让工作人员访问我的包中的功能?使用的解决方案foreach
会很棒,但我对使用parLapply
或其他功能/包的解决方案完全开放。