Как я могу передать необязательные аргументы функции сантехника, не переопределяя значения по умолчанию, заданные другой функцией? - PullRequest
2 голосов
/ 30 марта 2019

Я новичок в пакете сантехника и пытаюсь выяснить, как сделать функцию доступной, fun_2, через API, который может принимать необязательные аргументы. Необязательные аргументы имеют значения по умолчанию, указанные в функции fun_1 из пакета R. Как я могу сделать это без необходимости переопределять значения по умолчанию, указанные в 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)
}

1 Ответ

0 голосов
/ 02 апреля 2019

Я нашел подход, который работал довольно хорошо. Я перечислил все аргументы 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
}

...