У меня проблемы, когда я использую цикл 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?