1

%dopar%パッケージを使用してforeachパッケージを使用してローカルで並列にタスクを実行しdoSNOWてクラスターを作成しています(現時点ではこれをWindowsマシンで実行しています)。私はこれまで何度もこれを行ってきましたが、その中に a (つまり、非並列)foreachを使用して無関係なループを配置するまでは正常に機能します。%do%次に、Rがエラーを返します(トレースバック付き):

 Error in { : task 1 failed - "could not find function "%do%""  3 stop(simpleError(msg, call = expr))  2 e$fun(obj, substitute(ex), parent.frame(), e$data)  1 foreach(rc = 1:5) %dopar% {
    aRandomCounter = -1
    if (1 > 0) {
        for (batchi in 1:20) { ...

私のマシンで問題を再現するコードは次のとおりです。

require(foreach)
require(doSNOW)
cl<-makeCluster(5) 
registerDoSNOW(cl)
for(stepi in 1:10)  # normal outer for
{
  foreach(rc=1:5) %dopar% # the time consuming stuff in parallel (not looking to actually retrieve any data)
  {
    aRandomCounter = -1
    if(1 > 0)
    {
      for(batchi in 1:20) 
      {
        anObjectIwantToCreate <- foreach( qrc = 1:100, .combine=c ) %do% 
        {
          return(runif(1)) # I know this is not efficient, it is a placeholder to reproduce the issue
        }
        aRandomCounter = aRandomCounter + sum(anObjectIwantToCreate > 0.5)
      } 
    }
    return(aRandomCounter)
  }
}
stopCluster(cl)

インナーforeachをシンプルなforORに交換するの(l/s)applyが解決策です。しかし、これを内部で機能させる方法はありforeachますか?そもそもなぜエラーが発生するのですか?

4

2 に答える 2