0

假设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
4

1 回答 1

0

似乎yz都是非可选参数。您可以将它们设为可选,如下所示:

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

这不再引发错误。

于 2020-03-13T10:28:50.040 回答