【问题标题】:Can rlang::fn_fmls() be nested?rlang::fn_fmls() 可以嵌套吗?
【发布时间】:2020-10-03 19:51:37
【问题描述】:

文档表明这是可能的:

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

$a
[1] 1

$b
[1] 2

我想在一个函数中包含rlang::fn_fmls(),并为当前范围内的参数返回相同的结构。

预期行为:

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 有没有办法获得我想要的结果?

【问题讨论】:

    标签: r arguments rlang


    【解决方案1】:

    你在找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 月 3 日创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 2012-01-12
      • 2010-10-01
      相关资源
      最近更新 更多