Как вы справляетесь с пропущенными значениями в аргументе ...
функции?
У меня есть общая функция foo
, это шаблонный код, которым я хочу поделиться с другими функциями (в данном случае bar
). Я также хотел бы иметь возможность запускать bar()
с отсутствующими аргументами.
Проблема в том, что когда я использую list(...)
, отсутствующие значения вызывают ошибку:
foo = function(...){
list(...)
}
bar = function(name){
foo(name=name)
}
bar("a")
#> $name
#> [1] "a"
bar()
#> Error in foo(name = name): argument "name" is missing, with no default
Проблема здесь в том, что list(...)
принудительно оценивает все аргументы и выдает ошибку, прежде чем я смогу выполнить какой-либо missing
тест.
Я просматривал квазоры в rlang
, но is_missing
и quo_is_missing
нет кажется, работает на ...
.
library(rlang)
foo = function(...){
lapply(rlang::enquos(...), is_missing)
}
bar("a")
#> $name
#> [1] FALSE
bar()
#> $name
#> [1] FALSE
foo = function(...){
lapply(rlang::enquos(...), quo_is_missing)
}
bar("a")
#> $name
#> [1] FALSE
bar()
#> $name
#> [1] FALSE
И tidy_eval
вылетает с той же ошибкой:
foo = function(...){
lapply(rlang::enquos(...), eval_tidy)
}
bar("a")
#> $name
#> [1] "a"
bar()
#> Error in FUN(X[[i]], ...): argument "name" is missing, with no default
Редактировать
Чтобы уточнить, я хотел бы иметь дело с отсутствующими значениями так, как они рассматриваются в этом примере из quosore документация, но в ...
и без указания is_missing
для каждого аргумента в bar
. Я скопировал ниже пример из документации:
library(rlang)
fn <- function(arg) enquo(arg)
fn()
#> <quosure>
#> expr: ^
#> env: empty
quo_is_missing(fn())
#> [1] TRUE
bar()
без аргументов? Вы можете установить значение по умолчанию для имени:bar = function(name=NA){foo(name=name)}
. - person MrFlick   schedule 11.01.2021bar()
вернул? В настоящее время вы жестко кодируете параметрname=name
. Вы не можете передать отсутствующее значениеx
вlist(name=x)
. Итак, вы хотите иметь именованный параметр или нет? - person MrFlick   schedule 12.01.2021is_missing
по списку необязательных аргументов...
.foo
— это функция, содержащая некоторый общий код для функций с явными аргументами, но с разными именами. Идеально. Я хотел бы иметь возможность проверять отсутствующие аргументы вfoo
, а не вbar
. Теперьenquo(...)
создает список без ошибок, когда некоторые значения отсутствуют, но когда вы проверяете отсутствующие значения в результирующем списке,missing
иquo_is_missing
не могут их обнаружить. - person Duccio A   schedule 12.01.2021