检查任意函数调用中是否缺少多个参数

时间:2019-01-14 08:04:32

标签: r arguments rlang

是否有一种简洁的通用方法来通过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

reprex package(v0.2.1)于2019-01-14创建

1 个答案:

答案 0 :(得分: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 )
}

不确定它是否真的比原始版本更简洁。 ;)