为啥将 %dopar% 与 foreach 一起使用导致 R 无法识别包?

Posted

技术标签:

【中文标题】为啥将 %dopar% 与 foreach 一起使用导致 R 无法识别包?【英文标题】:Why is using %dopar% with foreach causing R to not recognize package?为什么将 %dopar% 与 foreach 一起使用导致 R 无法识别包? 【发布时间】:2020-02-14 21:55:53 【问题描述】:

我试图通过将 doParallel 包与 foreach 包一起使用,让我的代码在 R 上并行运行。我也在使用 sf 包来操作 shp 文件。我确保我的所有代码都在 foreach 循环中工作,只使用 %do% 所以如果出现错误,我可以更好地追踪它。我的代码使用 foreach 和 %do% 运行良好,但是当我更改它时, %dopar% R 会不断给我以下错误:

中的错误:任务 1 失败 -“找不到函数“st_geometry_type””

尽管我清楚地在 R 脚本的顶部使用了 require(sf)。我做了一个小函数,如果语句为真,则打印出“检查”以复制错误。

require(sf)
require(doParallel)
doParallel::registerDoParallel(cores = 2)

testforeach <- function(sfObject)

  foreach(i=1:10) %dopar% 
    if (st_geometry_type(sfObject[i,]) == "LINESTRING")
    
      print("check")
    
  

当我运行这段代码时,它会抛出同样的错误:

中的错误:任务 1 失败 - “找不到函数“st_geometry_type””

但是,当我将 %dopar% 替换为 %do% 时,它会打印出所有预期的“检查”消息。 这是R中的错误还是我错过了什么?我尝试重新安装我的软件包,但这似乎没有任何影响,因为我继续遇到同样的错误。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您需要在foreachfunction 中包含您将在循环中使用的包

foreach(i=1:10,.packages="sf") %dopar% 
    if (st_geometry_type(sfObject[i,]) == "LINESTRING")
    
      print("check")
    

【讨论】:

以上是关于为啥将 %dopar% 与 foreach 一起使用导致 R 无法识别包?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 foreach %dopar% 每增加一个节点就会变慢?

R:在 foreach %dopar% 中显示错误和警告消息

foreach %dopar% 使用带有 PSock 集群的顺序工作程序设置?

保存 foreach dopar 循环的多个输出

foreach 中的导出变量

如何以编程方式在 foreach 中的 %do% 和 %dopar% 之间切换?