【发布时间】:2021-09-08 03:02:56
【问题描述】:
我在使用调用自定义函数的 foreach 循环(使用 %dopar%)时遇到问题。使用Linux时确实没有问题,但是使用Windows时却找不到自定义函数。这个问题很难用语言来解释,所以我写了一个小例子来展示它。假设我有三个简单函数的集合,其中FUN2(使用%do%)和FUN3(使用%dopar%)调用第一个函数(FUN):
FUN <- function(x,y,z) { x + y + z }
FUN2 <- function(a, b) {
foreach(i=1:3) %do% FUN(i, a, b)
}
FUN3 <- function(a, b) {
foreach(i=1:3) %dopar% FUN(i, a, b)
}
函数存储在名为foreach_testfunctions.R 的脚本中。在另一个脚本 (foreach.test) 中,我获取了这些函数,使用 library(doParallel) 并尝试使用这些函数。首先我用 Linux 做,一切正常:
source("foreach_testfunctions.R")
a <- 2
b <- 3
library(doParallel)
registerDoParallel()
foreach(i=1:3) %do% FUN(i, a, b) ## works fine
FUN2(a, b) ## works fine
foreach(i=1:3) %dopar% FUN(i, a, b) ## works fine
FUN3(a, b) ## works fine
然后我在 Windows 中做:
source("foreach_testfunctions.R")
a <- 2
b <- 3
library(doParallel)
cl <- makeCluster(3)
registerDoParallel(cl)
foreach(i=1:3) %do% FUN(i, a, b) ## works fine
FUN2(a, b) ## works fine
foreach(i=1:3) %dopar% FUN(i, a, b) ## works fine
FUN3(a, b) ## does not work
Error in FUN(i, a, b) : task 1 failed - "Could not find function "FUN""
结论:(1)%do%没有问题。 (2)%dopar%在使用Windows时的问题。我尝试在调用FUN3 的行之前插入行clusterExport(cl, varlist=c("FUN", "a", "b"), env=environment()) 以确保在正确的环境中找到函数FUN 和变量a 和b,但错误仍然存在。
我的问题:尽管代码相同(除了 registerDoParallel 语法不同),为什么 Windows 的行为与 Linux 不同?当通过函数 FUN3 调用时,如何确保 Windows 确实 找到函数 FUN?
【问题讨论】:
标签: r foreach parallel-processing mpi