У меня проблемы, когда я использую цикл 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)
}
Функции хранятся в script, называемом foreach_testfunctions.R
. В другом script (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 найдены в соответствующей среде, но ошибка остается.
Мои вопросы: Почему Windows ведет себя иначе, чем Linux, хотя код идентичен (кроме синтаксиса registerDoParallel
)? Как я могу убедиться, что Windows выполняет найти функцию FUN
при вызове через функцию FUN3
?