doParallel:::当指定foreach(…,.export)时,doParallelSNOW会投诉

doParallel:::当指定foreach(…,.export)时,doParallelSNOW会投诉,r,foreach,parallel-processing,doparallel,R,Foreach,Parallel Processing,Doparallel,我很好奇doParallel:::doParallelSNOW()的设计参数是什么,当在.export中显式指定全局变量时发出警告?比如说, library("doParallel") registerDoParallel(cl <- parallel::makeCluster(2L)) a <- 1 y <- foreach(i = 1L, .export = "a") %dopar% { 2 * a } ## Warning in e$fun(obj, substitut

我很好奇
doParallel:::doParallelSNOW()
的设计参数是什么,当在
.export
中显式指定全局变量时发出警告?比如说,

library("doParallel")
registerDoParallel(cl <- parallel::makeCluster(2L))

a <- 1
y <- foreach(i = 1L, .export = "a") %dopar% { 2 * a }
## Warning in e$fun(obj, substitute(ex), parent.frame(), e$data) :
##  already exporting variable(s): a
library(“doParallel”)

registerDoParallel(cl我可能有一个解决方案,但我不建议按照您的要求去做

无论如何,如果将
foreach
调用包含在另一个函数中,则在
foreach
调用的直接环境中找不到
a
,因此它不会自动导出

library("doParallel")
registerDoParallel(cl <- parallel::makeCluster(2L))

a <- 1
foreach2 <- function() {
  foreach(i = 1L, .export = "a") %dopar% { 2 * a }
}
y <- foreach2()
library(“doParallel”)

registerDoParallel(cl我的解决方案是简单地删除
.export=“a”
,然后警告就消失了,因为警告刚刚说了
。export
冗余地导出
a
对象。

真正的用例是
插入符号
,它没有指定
.export
。(我不确定这是因为插入符号仅针对doParallel进行了微调,还是因为这是foreach的官方方法——“不要指定
.export
”)。如果,那么我的原始问题中会出现警告。谢谢Florian,我重新阅读了我的原始问题,并意识到它不清楚-我在最后更新了一个澄清。是的,欺骗
foreach::getexports()
如果无法将
检测为全局变量,将避免出现警告,我同意这不是一个好主意。这种方法的问题是,foreach在某些情况下无法找到一些全局变量,这意味着这是一个试错游戏。不幸的是,这还取决于您是将代码放入脚本还是程序包中,因此没有解决方案ion适合所有东西。我的问题的主要原因是询问设计选择,以及它是否是有意的。FWIW,有人在讨论如何使foreach发现globals,cf。