即使没有导出变量并指定包依赖性,foreach也能工作

时间:2014-12-07 09:06:48

标签: r foreach parallel-processing

阅读doc和SO问题,似乎foreach要求我指定:

  

.packages任务所依赖的包的字符向量。

     

.export要导出的变量字符向量。这可能很有用   访问当前未定义的变量时   环境。

但是,即使我的每项任务都依赖于library(tree)和变量formulas,以下代码也能正常运行。为什么我不必指定.packages="tree", .export="formulas"

library(tree)
data(iris)

registerDoMC(2)
formulas <- c(as.formula("Species ~ Sepal.Length + Sepal.Width"),
              as.formula("Species ~ Petal.Length + Petal.Width"))
Res <- foreach(i=(1:2)) %dopar% {
   formula <- formulas[[i]]
   grown_tree <- tree(formula, data=iris)
}

1 个答案:

答案 0 :(得分:2)

doMC后端使用mclapply函数并且mclapply分叉其工作者,因此工作者从当前进程继承其环境。因此,您不必使用.packages选项来加载已加载的包,也不必使用.export选项导出当前环境中定义的变量。诸如doSNOW,doMPI和doRedis之类的后端不使用fork,因此使用doMC的foreach循环可能无法在这些后端上运行。

我认为在doMC中使用这些选项是一个好习惯,因为它使代码更具可移植性,但正如您所发现的那样,并不总是必要的。