rlang::fn_fmls() 可以嵌套吗?

Can rlang::fn_fmls() be nested?

文档显示这是可能的:

fn <- function(a = 1, b = 2) rlang::fn_fmls() 
fn()

$a
[1] 1

$b
[1] 2

我想在一个函数中使用 rlang::fn_fmls(),并且 return 在当前范围内使用相同的参数结构。

预期行为:

x <- function(a, b){
  rlang::fn_fmls(fn = rlang::current_fn())
}

x(a = 1, b = 2)

$a
[1] 1

$b
[1] 2

实际行为:

x <- function(a, b){
    rlang::fn_fmls(fn = rlang::current_fn())
}

x(a = 1, b = 2)

$a


$b

我尝试过的另一种方法是:

x <- function(a, b){
    tmp <- base::match.call() %>% 
        base::as.list() 
  
  
    tmp %>% 
        stringr::str_detect('x') %>% 
        purrr::discard(tmp, .)
}

x(a = 1, b = 2)

$a
[1] 1

$b
[1] 2

rlang 有没有办法得到我想要的结果?

您在寻找 rlang::call_args 吗?

x <- function(a, b) rlang::call_args(sys.call())

x(a = 1, b = 2)
#> $a
#> [1] 1
#> 
#> $b
#> [1] 2

如果您正在寻找要“填写”的默认参数,那么您可以这样做:

x <- function(a = 1, b = 2)
{
  f  <- rlang::fn_fmls()
  mc <- as.list(match.call())[-1]
  append(mc, f[!names(f) %in% names(mc)])[names(f)]
}

产生以下行为:

x()
#> $a
#> [1] 1
#> 
#> $b
#> [1] 2

x(a = 5)
#> $a
#> [1] 5
#> 
#> $b
#> [1] 2

x(b = 7)
#> $a
#> [1] 1
#> 
#> $b
#> [1] 7

x(a = 5, b = 7)
#> $a
#> [1] 5
#> 
#> $b
#> [1] 7

reprex package (v0.3.0)

于 2020-10-03 创建