阅读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)
}
答案 0 :(得分:2)
doMC后端使用mclapply函数并且mclapply分叉其工作者,因此工作者从当前进程继承其环境。因此,您不必使用.packages
选项来加载已加载的包,也不必使用.export
选项导出当前环境中定义的变量。诸如doSNOW,doMPI和doRedis之类的后端不使用fork,因此使用doMC的foreach循环可能无法在这些后端上运行。
我认为在doMC中使用这些选项是一个好习惯,因为它使代码更具可移植性,但正如您所发现的那样,并不总是必要的。