当我使用%dopar%
调用自定义函数的 foreach 循环(使用)时遇到问题。使用Linux时确实没有问题,但是使用Windows时却找不到自定义函数。这个问题很难用语言来解释,所以我写了一个小例子来展示它。假设我有三个简单函数的集合,其中FUN2
(using %do%
) 和FUN3
(using %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时的问题。我尝试clusterExport(cl, varlist=c("FUN", "a", "b"), env=environment())
在调用的行之前插入该行,FUN3
以确保FUN
在正确的环境中找到函数和变量 a 和 b,但错误仍然存在。
registerDoParallel
我的问题:尽管代码相同(除了语法不同),为什么 Windows 的行为与 Linux 不同?如何确保 Windows在通过 function 调用时确实找到了函数?FUN
FUN3