2

我是水管工包的新手,我试图弄清楚如何fun_2通过一个可以接受可选参数的 api 来提供一个函数。可选参数的默认值在fun_1R 包中的函数 中指定。我怎样才能做到这一点而不必覆盖中指定的默认值fun_1

我尝试了一种简单的方法,即仅列出两个函数调用中的参数,而fun_2. 但这会产生缺少参数的错误。

我还尝试在fun_2. 这有效,但并不理想。我不想覆盖指定的默认值fun_1,以防将来发生变化。我希望从 api 调用的函数始终具有与直接调用fun_1.

fun_1(在 R 包中)

fun_1 <- function(x, y = c("a", "b", "c"), z = c("d", "e", "f"){
  ...
}

天真的方法

#* @post /myapi
  fun_2 <- function(x, y, z){
    fun_1(x, y, z)
}
curl -X POST "http://localhost:8000/myapi?x=0.001"
"error":["500 - Internal server error"],"message":["Error in FUN(X[[i]], ...): argument \"y\" is missing, with no default\n"]

这可行,但可能会覆盖 fun_1 默认值

#* @post /myapi
  fun_2 <- function(x, y = c("a", "b", "c"), z = c("d", "e", "f"){
    fun_1(x, y, z)
}
4

1 回答 1

0

我找到了一种效果很好的方法。我在 中列出了所有fun_1参数fun_2,并为可选参数设置了默认值,y并且z等于NULL。然后,我将所有参数放在一个列表中,从列表中删除为空的参数,然后将剩余参数的列表传递给fun_1使用该do.call函数。

#* @post /myapi
fun_2 <- function(x, y = NULL, z = NULL){
  params <- list(x = x, y = y, z = z)
  params <- params[!sapply(params, is.null)]
  result <- do.call(fun_1, params)
  result
}

于 2019-04-02T20:53:56.833 回答