如何将许多变量和函数从全局环境导出到 foreach 循环?
Posted
技术标签:
【中文标题】如何将许多变量和函数从全局环境导出到 foreach 循环?【英文标题】:How to export many variables and functions from global environment to foreach loop? 【发布时间】:2018-01-27 18:37:09 【问题描述】:如何在 foreach 中导出每个并行模拟开始时的全局环境?以下代码是为运行模拟而调用的函数的一部分。
num.cores <- detectCores()-1
cluztrr <- makeCluster(num.cores)
registerDoParallel(cl = cluztrr)
sim.result.list <- foreach(r = 1:simulations,
.combine = list,
.multicombine = TRUE,
) %dopar%
#...tons of calculations using many variables...
list(vals1,
vals2,
vals3)
stopCluster(cluztrr)
是否有必要将 .export 与我使用的 每个 变量和函数的字符向量一起使用?执行时间会很慢吗?
【问题讨论】:
请阅读Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers? - 总结是这不是解决志愿者的理想方式,并且可能会适得其反。请不要将此添加到您的问题中。 "cluztrr" rulezzz :-))) 【参考方案1】:如果 foreach 循环在全局环境中,则应自动导出变量。如果没有,您可以使用.export = ls(globalenv())
(或.GlobalEnv
)。
对于其他包中的函数,您只需要使用语法package::function
。
【讨论】:
如何调用不属于包但在全局环境中定义的函数? @F。私人【参考方案2】:F. Privé reply 的“如果 [...] 在 global 环境中,...”部分在这里非常重要。在这种情况下,foreach 框架只会识别全局变量。如果foreach()
调用是在函数内完成的,它不会这样做。
但是,如果您使用doFuture 后端(免责声明:我是作者);
library("doFuture")
registerDoFuture()
plan(cluster, workers = cl)
需要的全局变量将被自动识别和导出(然后由future 框架而不是foreach 框架完成)。现在,如果您依赖它,并且没有明确指定.export
,那么您的代码将只能与doFuture
一起使用,而不能与其他任何后端一起使用。这是您作为开发人员需要做出的决定。
此外,全局变量的自动导出也很简洁,但要小心知道导出了多少;导出太多太大的对象可能会非常昂贵,并且会在您的并行代码中引入大量开销。
【讨论】:
是否也导出父环境中的变量? :-) 是的。它通过采用允许误报的“乐观”方法来做到这一点,也就是说,可以找到不是真正全局的全局变量(可能发生在例如非标准评估中)。有时,代码会错过真正的肯定,然后您(显然)会遇到运行时错误。在这种情况下,您可以轻松地指导它 - 请参阅未来的小插图“解决方案的常见问题”(cran.r-project.org/package=future)了解如何。以上是关于如何将许多变量和函数从全局环境导出到 foreach 循环?的主要内容,如果未能解决你的问题,请参考以下文章