%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
をシンプルなfor
ORに交換するの(l/s)apply
が解決策です。しかし、これを内部で機能させる方法はありforeach
ますか?そもそもなぜエラーが発生するのですか?