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

11

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

我调用了一个名为awareRateSIR的函数,并在该函数体内使用了一些额外的包。我遇到了一些错误,例如

找不到函数"vcount"和..

我知道vcountigraph包中的一个函数,它被用在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", : 实际参数中有多个匹配了形式参数“.packages”

提前感谢。

2个回答

23
你应该使用以下方式使用函数,传递所需的所有包:
tp<-foreach(i=1:iter,  .inorder = FALSE, .export = "awareRateSIR",
          .packages = c("igraph", "doParallel"))%dopar%{
tp <- awareRateSIR(graphContact, graphCom,state)
return(tp)
}

2

通常,在使用 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)

你能否举些例子详细说明最后一点?因为我目前遇到了一个确切的问题,我尝试在多个函数上使用foreach,而每个函数都包含许多其他子函数。 - user177196
1
@user177196 请查看我的编辑。 - F. Privé

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接