【问题标题】:How can I pass optional arguments to a plumber function without overriding the defaults specified by another function?如何在不覆盖另一个函数指定的默认值的情况下将可选参数传递给管道工函数?
【发布时间】:2019-08-21 07:57:48
【问题描述】:

我是管道工包的新手,我正在尝试通过一个可以接受可选参数的 api 来弄清楚如何使一个函数可用,fun_2。可选参数的默认值在 R 包中的函数fun_1 中指定。如何在不覆盖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)
}

【问题讨论】:

    标签: r plumber


    【解决方案1】:

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

    #* @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
    }
    
    

    【讨论】:

      猜你喜欢
      • 2011-11-15
      • 2013-09-07
      • 2020-09-10
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      • 2018-09-10
      相关资源
      最近更新 更多