我在 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%
它可以工作,但正如预期的那样,它非常慢,因为我们为每个任务调用一次编译器。
有没有人对错误发生的原因有一些见解或有关如何修复它的建议?
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()}
谢谢!古斯塔沃