"R" 如何在 foreach 循环中导出多个函数或包

How to export multiple function or packages in foreach loop in "R"

我正在尝试通过在 R 中使用 doParallel 包来减少 运行 我的代码时间。

我正在调用一个函数 awareRateSIR,该函数的主体中使用了一些额外的包。我收到一些错误,例如

could not find function "vcount" and..

我知道 vcount 是包 igraph 的一个函数,用于 awareRateSIR) 但它不是唯一的。我怎么解决这个问题?我想我应该传递我的函数 awareRateSIR 中使用的所有包名称,但我不知道如何在 foreach 中导出多个函数或如何导出多个包名称。

这是我的代码:

tp<-foreach(i=1:iter,  .inorder = FALSE, .export = "awareRateSIR",
          .packages = "igraph", .packages="doParallel")%dopar%{
tp <- awareRateSIR(graphContact, graphCom,state)
return(tp)
}

如果我不传递这些包,我将得到错误状态一些功能未知如果我传递所有的包,我将得到错误:

Error in foreach(i = 1:iter, .inorder = FALSE, .export = "awareRateSIR", : formal argument ".packages" matched by multiple actual arguments"

提前致谢

您应该使用 c 函数传递所有需要的包,如下所示:

tp<-foreach(i=1:iter,  .inorder = FALSE, .export = "awareRateSIR",
          .packages = c("igraph", "doParallel"))%dopar%{
tp <- awareRateSIR(graphContact, graphCom,state)
return(tp)
}

通常情况下,使用 foreach 时不需要导出任何变量、函数或包。

对于变量和函数,它们只需要与 foreach 语句处于相同的环境中(最好是在函数中只传递您需要的内容)。

当需要其他包的功能时,您只需使用 package::function,就像在包内一样。


例如你可以做到

library(doParallel)
registerDoParallel(cl <- makeCluster(3))

df <- iris

foreach(spec = unique(iris$Species)) %dopar% {
  dplyr::filter(df, Species == !!spec)
}

stopCluster(cl)