parSapplyLB с отсутствующими аргументами - PullRequest
0 голосов
/ 13 марта 2020

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

1 Ответ

0 голосов
/ 13 марта 2020

Кажется, что y и z являются необязательными аргументами. Вы можете сделать их необязательными, как указано ниже:

fun.v2 <- function(x, y = NULL, z = NULL) {
  cl <- makeCluster(2)
  bf <- parSapplyLB(cl = cl, X = x, fun, y, z)
  stopCluster(cl = cl)
}

Это больше не выдает ошибку.

...