包含 foreach 的 R 包将与 doParallel 一起工作,但不能与 doMPI 一起工作,找不到对象
R package containing foreach will work with doParallel but not doMPI, can not find object
我正在尝试在 foreach 语句和 doMPI 后端中编写一个包含多个嵌套函数的 R 包。它抛出一个 "cannot find "XXX" 对象错误。奇怪的是,如果我使用 doParallel 作为后端,则不会发生此错误。这是问题的一个示例,但我可以使用一个有效的解决方案,将 doMPI 用于更大的问题。
这是使用 RStudio、roxygen、devtools 等编译到 R-Package 中的代码
#' 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)
}
然后我加载库并使用 emacs ESS(或从 RStudio 编辑器)和这些命令从 .R 文件调用顶级函数
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 at https://github.com/jamaas/toymod.git
有人可以告诉我是否需要更改 doMPI 的代码吗?好像跟制作R包有关
我认为问题在于您需要使用 foreach .packages='toymod'
选项。这是因为 foreach 循环的主体实际上并不是 'toymod' 包的一部分,因此您需要加载 'toymod' 就像访问任何其他 R 包中的函数一样。
我不知道为什么在使用 doParallel 时不需要这样做。我猜 doParallel 必须自动加载 foreach 循环所在的包。我会再研究一下,也许修改 doMPI 来做同样的事情。
我正在尝试在 foreach 语句和 doMPI 后端中编写一个包含多个嵌套函数的 R 包。它抛出一个 "cannot find "XXX" 对象错误。奇怪的是,如果我使用 doParallel 作为后端,则不会发生此错误。这是问题的一个示例,但我可以使用一个有效的解决方案,将 doMPI 用于更大的问题。
这是使用 RStudio、roxygen、devtools 等编译到 R-Package 中的代码
#' 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)
}
然后我加载库并使用 emacs ESS(或从 RStudio 编辑器)和这些命令从 .R 文件调用顶级函数
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 at https://github.com/jamaas/toymod.git
有人可以告诉我是否需要更改 doMPI 的代码吗?好像跟制作R包有关
我认为问题在于您需要使用 foreach .packages='toymod'
选项。这是因为 foreach 循环的主体实际上并不是 'toymod' 包的一部分,因此您需要加载 'toymod' 就像访问任何其他 R 包中的函数一样。
我不知道为什么在使用 doParallel 时不需要这样做。我猜 doParallel 必须自动加载 foreach 循环所在的包。我会再研究一下,也许修改 doMPI 来做同样的事情。