【发布时间】:2020-03-13 10:22:55
【问题描述】:
假设 fun 是一个有 3 个参数的函数 (x, y, z) 和 y 或 z 需要指定,但不能同时指定。
fun <- function(x, y, z) {
if (missing(y)) {
x^2
} else {
x^5
}
}
现在假设这个函数在另一个函数中被调用:
fun.v1 <- function(x, y, z) {
sapply(x, fun, y, z)
}
> fun.v1(1:5, y = 4)
[1] 1 32 243 1024 3125
> fun.v1(1:5, z = 4)
[1] 1 4 9 16 25
现在我想实现一个并行后端,而不是使用sapply:
require(parallel)
fun.v2 <- function(x, y, z) {
cl <- makeCluster(2)
bf <- parSapplyLB(cl = cl, X = x, fun, y, z)
stopCluster(cl = cl)
}
fun.v2(1:5, y = 4)
fun.v2(1:5, z = 4)
此代码给出错误。有没有办法解决这个问题?
更新:下面的代码按预期工作。但是有没有更简洁的方法呢?
fun <- function(x, y, z) {
if (is.null(y)) {
x^2
} else {
x^5
}
}
fun.v2 <- function(x, y, z) {
cl <- makeCluster(2)
tmp1 <- if(missing(y))
NULL
else y
tmp2 <- if(missing(z))
NULL
else z
bf <- parSapplyLB(cl = cl, X = x, fun, y = tmp1, z = tmp2)
stopCluster(cl = cl)
return(bf)
}
> fun.v2(1:5, y = 4)
[1] 1 32 243 1024 3125
> fun.v2(1:5, z = 4)
[1] 1 4 9 16 25
【问题讨论】: