【发布时间】:2021-08-06 07:39:15
【问题描述】:
我了解到在 R 中执行嵌套 foreach 循环的正确方法是通过嵌套运算符 %:%(例如 https://cran.r-project.org/web/packages/foreach/vignettes/nested.html)。
但是,当使用这种方法时,不能在内循环和外循环之间添加代码 -- 请参见下面的示例。
有没有办法创建嵌套的、并行化的 foreach 循环,以便在内循环和外循环之间添加代码?
更一般地说,想到的明显方式有什么问题,即简单地使用 %dopar% 运算符而不是 %:% 运算符嵌套两个 foreach 循环?请参阅下面的简单示例。
library(foreach)
# Set up backend
cl = makeCluster(6)
registerDoParallel(cl)
on.exit(stopCluster(cl))
# Run nested loop with '%:%' operator. Breaks if adding code between the inner and outer loops
foreach(i=1:2) %:%
# a = 1 #trivial example of running code between outer and inner loop -- throws error
foreach(j = 1:3) %dopar% {
i * j
}
# Run nested loop using 2 '%dopar%' statements -- is there anything wrong with this?
foreach(i=1:2, .packages = 'foreach') %dopar% {
a = 1 #trivial example of running code between outer and inner loop
foreach(j = 1:3) %dopar% {
i * j
}
}
【问题讨论】:
-
我会避免尝试运行嵌套的并行循环,应该并行化内部或外部循环,而不是同时并行化两者。如果你有 6 个核心并且所有 6 个核心都用于外循环,那么如何有任何剩余的核心来并行化内循环?
-
我猜你可以使用 R 包 {future} 中的期货循环来做到这一点。
标签: r foreach parallel-processing doparallel