如何将附加参数(存储在“…”中)传递给R的parLapply的多个内核?

问题描述 投票:0回答:1

我正在编写一个函数f1(),该函数接受其他参数“ ...”传递给f1()内部的函数f0()。更准确地说,在f1内部的并行lapply调用中调用了f0()。只要至少要传递一个参数,它就可以正常工作,但是如果“ ...”为空,则会收到错误消息:“ get(name,envir = envir)中的错误:参数“ ...”缺少,没有默认值“

如果我使用lapply而不是parLapply,效果很好。

是否有适当的解决方案?我不想在f1()的定义中明确定义f0()的所有参数。

首先,我用两个可选参数定义函数。

f0 <- function(a, b, d1 = NULL, d2 = NULL){
   if(is.null(d1)){
      ret <- a * b
   }else{
      ret <- a * b / d1
   }
   if(!is.null(d2)){
      ret <- ret - d2
   }
   ret
}

接下来,执行相同功能的函数f1()和f1_par(),一个使用sapply,另一个使用parSapply。

f1 <- function(A, ...){
   # A ... vector of a
   B <- rev(A)

   sapply(seq_along(A), function(i){
      f0(A[i], B[i], ...)
   }) 
}


f1_par <- function(A, ...){
   # A ... vector of a
   B <- rev(A)
   cl <- parallel::makeCluster(2)
   parallel::clusterExport(cl, envir = environment(), c("A", "B", "f0","..."))
   ret <- parallel::parSapply(cl, seq_along(A), function(i){
      f0(A[i], B[i], ...)
   }) 
   parallel::stopCluster(cl)
   ret
}

对于最后六个函数调用,最后一个函数,我都得到了正确的结果:

A <- 1:4

# sapply
f1(A, d1 = 2, d2 = 4)
f1(A, d1 = 2)
f1(A)

# parSapply
f1_par(A, d1 = 2, d2 = 4)
f1_par(A, d1 = 2)
f1_par(A) # this one causes the error

r parallel-processing parameter-passing lapply optional-parameters
1个回答
1
投票

我很确定您不能以这种方式导出...。相反,请确保传递...作为参数,如:

f1 <- function(A, ...) {
   # A ... vector of a
   B <- rev(A)

   sapply(seq_along(A), function(i, ...) {
      f0(A[i], B[i], ...)
   }, ...) 
}

然后,对parallel::parSapply()执行相同的操作。

© www.soinside.com 2019 - 2024. All rights reserved.