我正在编写一个函数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
我很确定您不能以这种方式导出...
。相反,请确保传递...
作为参数,如:
f1 <- function(A, ...) {
# A ... vector of a
B <- rev(A)
sapply(seq_along(A), function(i, ...) {
f0(A[i], B[i], ...)
}, ...)
}
然后,对parallel::parSapply()
执行相同的操作。