【问题标题】:parSapplyLB with missing argumentsparSapplyLB 缺少参数
【发布时间】:2020-03-13 10:22:55
【问题描述】:

假设 fun 是一个有 3 个参数的函数 (x, y, z)yz 需要指定,但不能同时指定。

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

【问题讨论】:

    标签: r rparallel


    【解决方案1】:

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

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

    这不再引发错误。

    【讨论】:

    • 这不会出错。但输出与我得到的 fun.v1 不同。
    猜你喜欢
    • 2018-09-23
    • 1970-01-01
    • 2022-01-16
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多