阅读文档和SO问题,似乎foreach
需要我指定:
.packages character vector of packages that the tasks depend on.
.export character vector of variables to export. This can be useful when accessing a variable that isn't defined in the current environment.
但是,即使我的每个任务都依赖于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)
}
最佳答案
doMC 后端使用 mclapply 函数,并且 mclapply fork 其工作线程,因此工作线程从当前进程继承其环境。因此,您不必使用 .packages
选项来加载已加载的包,也不必使用 .export
选项来导出在当前环境中定义的变量。 doSNOW、doMPI 和 doRedis 等后端不使用 fork,因此与 doMC 配合使用的 foreach 循环可能不适用于这些后端。
我认为将这些选项与 doMC 一起使用是一个很好的做法,因为它使代码更加可移植,但正如您所发现的,这并不总是必要的。
关于r - 即使不导出变量并指定包依赖项,foreach 也能工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27341210/