Пакет R, содержащий foreach, будет работать с doParallel, но не с doMPI, не может найти объект

Я пытаюсь написать пакет R, который содержит несколько вложенных функций, в операторе foreach и бэкэнде doMPI. Выдает ошибку объекта "не удается найти"XXX". Странно то, что эта ошибка не возникает, если я использую doParallel в качестве бэкэнда. Это пример проблемы, но я мог бы использовать работающее решение с doMPI для многих большие проблемы.

Это код, который был скомпилирован в R-Package с использованием RStudio, roxygen, devtools и т. Д.

#' Test function level 1
#' @param var11 first variable for function 1
#' @param var12 second variable for function 1
#' @param var13 third variable for function 1
#' @export fun1

fun1 <- function (fun2.params, fun3.params, var11, var12, var13, ...) {

    results <- data.frame (foreach::`%dopar%`(
               foreach::`%:%`(foreach::foreach(j = 1:var11, .combine = cbind),
               foreach::foreach (i = 1:var12, .combine=rbind)),
               {
                   out3 <- replicate(var13,
                                     do.call(fun2,
                                             c(list(fun3.params=fun3.params),
                                               fun2.params)))
                   output2 <- data.frame(mean(out3))
        }
    )
)
    ## save outputs for subsequent analyses if required
saveRDS(results, file = paste("./outputs/", var13 ,"_", var12, "_", var11, "_",
                              format(Sys.time(), "%d_%m_%Y"), ".rds", sep=""))
}

#' Test function level 2
#' @param var21 first variable for function 2
#' @param var22 second variable for function 2
#' @export fun2

fun2 <- function (fun3.params, var21, var22, ...) {
    out2 <- `if` (rpois(1, var21) > 0, var22 * do.call(fun3, fun3.params), 0)
}

#' Test function level 3
#' @param var31 first variable for function 3
#' @param var32 second variable for function 3
#' @param var33 third variable for function 3
#' @export fun3

fun3 <- function (var31, var32, var33, ...) {
    out3 <- var31 * rnorm(1, mean=var32, sd= var33)
}

Затем я загружаю библиотеку и вызываю функцию верхнего уровня из файла.R, используя emacs ESS (или из редактора RStudio) и эти команды

library(toymod)
library(doParallel)
cl <-makeCluster(10)
registerDoParallel(cl)

fun1.params <- list(var11=10, var12=150, var13=365)
fun2.params <- list(var21=0.05,var22=9.876)
fun3.params <- list(var31=1.396,var32=14.387,var33=3.219)

do.call(fun1, c(list(fun2.params = fun2.params,
                     fun3.params = fun3.params),
                fun1.params))

Когда я запускаю его, используя doParallel в качестве параллельного бэкэнда, он работает нормально, однако, когда я запускаю его с использованием doMPI, я получаю следующую ошибку

Error in { : task 12 failed - "object 'fun2' not found"

Это работает на Ubuntu 16.04 Linux, используя R 3.4.1, doMPI 0.2.2 и doParallel. Я разместил весь пакет на github по адресу https://github.com/jamaas/toymod.git

Может ли кто-нибудь сказать мне, если мне нужно изменить код для doMPI? Похоже, это связано с производством пакета R.

1 ответ

Решение

Я считаю, что проблема заключается в том, что вам нужно использовать foreach .packages='toymod' вариант. Это связано с тем, что тело цикла foreach на самом деле не является частью пакета "toymod", и поэтому вам нужно загрузить "toymod", как если бы вы получали доступ к функциям из любого другого пакета R.

Я не знаю, почему это не нужно при использовании doParallel. Я предполагаю, что doParallel должен автоматически загружать пакет, в котором находится цикл foreach. Я рассмотрю это еще немного и, возможно, изменю doMPI, чтобы сделать то же самое.

Другие вопросы по тегам