Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在并行foreach循环中使用source()_R_Foreach - Fatal编程技术网

在并行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