r - 即使不导出变量并指定包依赖项,foreach 也能工作

标签 r foreach parallel-processing

阅读文档和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/

相关文章:

java - 不理解二维数组的每个循环

c++ - CUDA:Mark Harris 的并行缩减样本不只是对每个线程 block 求和吗?

r - data.table:为什么不能总是总是直接传递列名?

r - 将曲线拟合到特定数据

r - R中如何求某列的最小值?

r - 如何在 vim 中使用模板

javascript - 我如何将 foreach 按钮单个值传递给 javascript?

php - 如何定义 foreach 循环中的最后一个元素?

python - joblib.Parallel 用于嵌套列表理解

bash - 并行运行一定数量的命令-对比xargs -P,GNU并行和“moreutils”并行