如何将许多变量和函数从全局环境导出到 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 循环?的主要内容,如果未能解决你的问题,请参考以下文章

如何从回调函数中修改全局变量。在 node.js 中

如何在没有评估环境的情况下对函数进行集群导出

如何将类型从 Vue3 组件导出到全局范围?

Windows中的库编程

static的用法,全局变量与局部变量

环境变量—《linux命令行与shell脚本编程大全》