如何将多个变量和函数从全局环境导出到 foreach 循环?

How to export many variables and functions from global environment to foreach loop?

如何导出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 与我使用的 每个 变量和函数的字符向量一起使用?执行时间会很慢吗?

如果foreach循环在全局环境中,变量应该自动导出。如果没有,您可以使用 .export = ls(globalenv())(或 .GlobalEnv)。

对于其他包中的函数,您只需使用语法 package::function.

的 "If [...] in the global environment, ..." 部分在这里非常重要。在这种情况下,foreach 框架只会识别全局变量。如果 foreach() 调用是在函数内完成的,它将 不会 这样做。

但是,如果您使用 doFuture 后端(免责声明:我是作者);

library("doFuture")
registerDoFuture()
plan(cluster, workers = cl)

需要的全局变量将被自动识别和导出(然后由future框架而不是foreach框架完成)。现在,如果您依赖于此,并且没有明确指定 .export,那么您的代码将仅适用于其他后端的 doFuture 和 none。这是您作为开发人员需要做出的决定。

此外,全局变量的自动导出很简洁,但要注意你知道导出了多少;导出太多太大的对象可能会非常昂贵,并且会在并行代码中引入大量开销。