R通过函数传递缺少的参数

R passing missing arguments through functions

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

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

为什么不这样做:

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

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

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

bigfn()
# <quosure>
# expr: ^
# env:  empty
# [1] TRUE

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

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

bigfn()
# <quosure>
# expr: ^
# env:  empty
# [1] TRUE

bigfn(42)
# <quosure>
# expr: ^42
# env:  empty
# [1] FALSE