Windows 7 と Linux (SUSE Server 11 (x86_64)) の両方で R 3.0.1 を使用しています。次のコード例では、Windows ではエラーが発生しますが、Linux では発生しません。リストされているツールボックスはすべて、両方のマシンで最新のものです。Windows エラーは次のとおりです。
Error in { : task 1 failed - "NULL value passed as symbol address"
を変更する%dopar% to %do%
と、Windows コードはエラーなしで実行されます。私の最初の推測では、これは Windows の構成の問題に関連していて、Rcpp と R を再インストールしようとしましたが、役に立ちませんでした。エラーはスコープに関連しているようです.f1内で関数cFuncを定義してコンパイルすると%dopar%
動作しますが、予想通り、タスクごとにコンパイラを1回呼び出すため、非常に遅くなります。
エラーが発生する理由や修正方法についての提案について、誰かが洞察を持っていますか?
library(inline)
sigFunc <- signature(x="numeric", size_x="numeric")
code <- ' double tot =0;
for(int k = 0; k < INTEGER(size_x)[0]; k++){
tot += REAL(x)[k];
};
return ScalarReal(tot);
'
cFunc <- cxxfunction(sigFunc, code)
f1 <- function(){
x <- rnorm(100)
a <- cFunc(x=x, size_x=as.integer(length(x)))
return(a)
}
library(foreach)
library(doParallel)
registerDoParallel()
# this produces an error in Windows but not in Linux
res <- foreach(counter=(1:100)) %dopar% {f1()}
# this works for both Windows and Linux
res <- foreach(counter=(1:100)) %do% {f1()}
# The following is not a practical solution, but I can compile cFunc inside f1 and then this works in Windows but it is very slow
f1 <- function(){
library(inline)
sigFunc <- signature(x="numeric", size_x="numeric")
code <- ' double tot =0;
for(int k = 0; k < INTEGER(size_x)[0]; k++){
tot += REAL(x)[k];
};
return ScalarReal(tot);
'
cFunc <- cxxfunction(sigFunc, code)
x <- rnorm(100)
a <- cFunc(x=x, size_x=as.integer(length(x)))
return(a)
}
# this now works in Windows but is very slow
res <- foreach(counter=(1:100)) %dopar% {f1()}
ありがとう!グスタボ