【问题标题】:R passing missing arguments through functionsR通过函数传递缺少的参数
【发布时间】:2020-11-19 20:41:58
【问题描述】:

我似乎找不到可以帮助我解决此问题的 SO 帖子。我的最小可重现示例是:

bigfn <- function(x) {
  smallfn(x)
}

smallfn <- function(y) {
  y <- rlang::enquo(y)
  print(y)
  print(rlang::quo_is_missing(y))
}

bigfn() 的输出为:

<quosure>
expr: ^x
env:  0x7fc93fc0f8c8
[1] FALSE

但我希望 quosure 是一个空的 quosure,FALSETRUE 以反映 bigfn 通过 smallfn 向下传播缺失值这一事实。

此外,我不想将enquo 移动到bigfn,因为我仍然希望能够独立于bigfn 使用smallfn

【问题讨论】:

    标签: r rlang nse


    【解决方案1】:

    也许一种称为“转发点”的模式在这里可能有用。它保留了缺失的参数,并且在非标准评估的上下文中表现良好:

    bigfn <- function(...) {
      smallfn(...)
    }
    
    bigfn()
    # <quosure>
    # expr: ^
    # env:  empty
    # [1] TRUE
    

    但是,如果您确实需要通过名称引用特定参数,则需要使用{{!!enquo 的简写)将它们“隧道”到smallfn()

    bigfn <- function(x) {
      smallfn({{x}})
    }
    
    bigfn()
    # <quosure>
    # expr: ^
    # env:  empty
    # [1] TRUE
    
    bigfn(42)
    # <quosure>
    # expr: ^42
    # env:  empty
    # [1] FALSE
    

    【讨论】:

      【解决方案2】:

      为什么不这样做:

      bigfn <- function(x) {
        if(missing(x)) smallfn()
        else smallfn(x)
      }
      

      那么,在不改变 smallfn 的情况下,你有:

      bigfn()
      #> <quosure>
      #> expr: ^
      #> env:  empty
      #> [1] TRUE
      
      bigfn(2)
      #> <quosure>
      #> expr: ^x
      #> env:  00000000119E8FD0
      #> [1] FALSE
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-12
        • 1970-01-01
        • 2021-09-07
        • 1970-01-01
        • 1970-01-01
        • 2018-11-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多