Предположим, 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