私はRパッケージを開発しており、恥ずかしいほど並列の問題のために並列処理を使用しようとしています。パッケージの他の関数を使用するループまたは関数を書きたいと思います。私は Windows で作業しており、 と を使用しようとしましparallel::parLapply
たforeach::%dopar%
が、ワーカー (コア) がパッケージ内の関数にアクセスできません。以下は、2 つの関数を含む単純なパッケージの例です。2 番目の関数は、 を使用して並列ループ内で最初の関数を呼び出します%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
または他の機能/パッケージを使用したソリューションに対して完全にオープンです。