4

私はRパッケージを開発しており、恥ずかしいほど並列の問題のために並列処理を使用しようとしています。パッケージの他の関数を使用するループまたは関数を書きたいと思います。私は Windows で作業しており、 と を使用しようとしましparallel::parLapplyforeach::%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()を呼び出すと、が返されます。slowaddError 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または他の機能/パッケージを使用したソリューションに対して完全にオープンです。

4

1 に答える 1