Проверить наличие нескольких пропущенных аргументов при вызове произвольной функции

Есть ли более лаконичный универсальный способ проверки отсутствующих аргументов при вызове функции с помощью функции rlang?

Мне не нравится rlang::call_frame()$env %>% as.list(), но я не мог заставить ничего работать, например, rlang::fn_fmls() или rlang::call_args()

library(magrittr)

foo <- function(a, b) {
  rlang::call_frame()$env %>% 
    as.list() %>% 
    purrr::map_lgl(rlang::is_missing)
}
foo()
#>    a    b 
#> TRUE TRUE
foo(1)
#>     a     b 
#> FALSE  TRUE
foo(1, 2)
#>     a     b 
#> FALSE FALSE
foo(b = 2)
#>     a     b 
#>  TRUE FALSE

Создано 14 января 2019 г. пакет REPEX (v0.2.1)


person Rappster    schedule 14.01.2019    source источник


Ответы (1)


Вам нужен rlang::fn_fmls_syms(), который возвращает список формальных аргументов в виде символов. Передайте их напрямую enexprs через do.call, чтобы получить пользовательские выражения для каждого аргумента:

foo <- function( a, b ) {
  do.call( rlang::enexprs, rlang::fn_fmls_syms() ) %>%
    purrr::map_lgl( rlang::is_missing )
}

Не уверен, действительно ли он более лаконичен, чем ваша оригинальная версия. ;)

person Artem Sokolov    schedule 12.03.2019