foreach には、理解できない問題があります。次のコードは、私が試した 2 台の Windows コンピューターでは失敗しますが、同じバージョンの R と doParallel を実行している 3 台の Linux コンピューターでは成功します。
library("doParallel")
registerDoParallel(cl=2,cores=2)
f <- function(){return(10)}
g <- function(){
r = foreach(x = 1:4) %dopar% {
return(x + f())
}
return(r)
}
g()
これら 2 台の Windows コンピューターでは、次のエラーが返されます。
Error in { : task 1 failed - "could not find function "f""
ただし、これは Linux コンピューターで問題なく動作し、%dopar% の代わりに %do% を使用しても問題なく動作し、通常の for ループでも問題なく動作します。
同じことが変数にも当てはまりますi <- 10
。return(x + f())
return(x + i)
同じ問題を抱えている他の人には、次の 2 つの回避策があります。
1) .export を使用して、必要な関数と変数を明示的にインポートします。
r = foreach(x=1:4, .export="f") %dopar%
2) すべてのグローバル オブジェクトをインポートします。
r = foreach(x=1:4, .export=ls(.GlobalEnv)) %dopar%
これらの回避策の問題は、大規模で活発に開発中のパッケージに対して最も安定していないことです。いずれにせよ、foreach は for のように動作するはずです。
これを引き起こしている原因と、修正があるかどうかについてのアイデアはありますか?
機能が動作するコンピュータのバージョン情報:
R version 3.2.2 (2015-08-14)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: CentOS release 6.5 (Final)
other attached packages:
[1] doParallel_1.0.10 iterators_1.0.8 foreach_1.4.3
機能が動作しないコンピュータ:
R version 3.2.2 (2015-08-14)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
other attached packages:
[1] doParallel_1.0.10 iterators_1.0.8 foreach_1.4.3