在并行foreach循环中使用source()
这里有一个玩具的例子来说明我的问题在并行foreach循环中使用source(),r,foreach,R,Foreach,这里有一个玩具的例子来说明我的问题 library(foreach) library(doMC) registerDoMC(cores=2) foreach(i = 1:2) %dopar%{ i + 2 } [[1]] [1] 3 [[2]] [1] 4 到目前为止还不错 但是如果代码i+2保存在文件addition.R中,并且我使用source()调用该文件,那么 > foreach(i = 1:2) %dopar%{ + source("addition.R") + }
library(foreach)
library(doMC)
registerDoMC(cores=2)
foreach(i = 1:2) %dopar%{
i + 2
}
[[1]]
[1] 3
[[2]]
[1] 4
到目前为止还不错
但是如果代码i+2
保存在文件addition.R
中,并且我使用source()
调用该文件,那么
> foreach(i = 1:2) %dopar%{
+ source("addition.R")
+ }
Error in { : task 1 failed - "object 'i' not found"
我无法完全复制您的玩具,但我有一个笑脸问题,我可以通过以下方式解决:
source(file, local = TRUE)
应该在本地环境中解析源,即识别i.NiceE的评论和Sosel的回答已经解决了这一问题;调用
源(文件)
时,它默认为源(文件,local=FALSE)
,这意味着源文件中的代码正在全局环境(“用户的工作区”)中进行评估,请参见?source
。请注意,全局环境中没有变量i
。解决方案是确保文件来源于调用它的环境,即使用source(file,local=TRUE)
解决方案:
其中:
Error in eval(ei, envir) : object 'i' not found
现在,当且仅当从全局环境调用时,上面的foreach(i=1:2)%dopar%{source(“addition.R”)}
与registerDoSEQ()一起工作的原因是,然后在调用环境中评估foreach迭代,这是全局环境,这是source()
使用。但是,如果使用了local(foreach(i=1:2)%dopar%{…})
也会与上面的local(for(i in 1:2){…})调用类似地失败
总而言之:没有什么神奇的事情发生,但是理解它有点乏味。我最终解决了这个问题,将源代码(“addition.R”)转换为一个函数,并简单地将变量传递给它。我不知道为什么,但是基于源代码(file,local=TRUE)
的建议解决方案不起作用。尝试使用此源代码(“addtition.R,local=t)
在调用它的环境中评估源代码。在%dopar%块中调用di find source()会显著降低计算速度,由于子进程必须通过网络获取源文件,因此source(“addition.R”,local=TRUE)
对您不起作用对我来说没有意义。你能用我从你的OP中采用的可复制的例子来复制这个错误吗?或者你指的是更复杂的R脚本?如果是后者,可能有数百万个原因。还有,什么设置/sessionInfo()
?我说的正是上面提到的脚本和错误。这真的很奇怪。您是否也在local({for(i in 1:12)…})
示例中得到错误?如果是这样,那就排除了foreach等。重要的是,在出现错误后,您的sessionInfo()
是什么?我怀疑你的设置中有什么东西导致了这种差异。在终端或GUI(例如RStudio)中运行R?
local({
for(i in 1:2) {
source("addition.R")
}
})
Error in eval(ei, envir) : object 'i' not found