2

我正在尝试使用 quasiquotation 将原始变量名称传递给函数,然后将其传递给另一个函数。但是,参数是可选的,所以我需要测试第一个函数是否没有给出参数并将缺少的参数传递给第二个函数。

在这些示例b中,指的是 data.frame 中的变量。

测试一个函数是否传递了一个原始变量表达式或没有参数,我做

foo <- function(a) {
  print(is_missing(enexpr(a)))
}
foo()
# [1] TRUE
foo(b)
# [1] FALSE

如果没有enexpr,变量b将尝试被评估 - 并且当丢失时 - 错误。

接下来,我尝试将缺少的参数传递给另一个函数 ( bar),然后该函数将测试它的存在:

foo2 <- function(a) {
  print(is_missing(enexpr(a)))
  bar(maybe_missing(a))
}
bar <- function(a) {
  print(is_missing(enexpr(a)))
}
foo2()
# [1] TRUE 
# [1] FALSE  <-- "wrong" (but not unexpected)
foo2(b)
# [1] FALSE
# [1] FALSE

问题:如何bar测试是否foo2通过了参数?

使用 rlang 0.3.0.1 运行 R 3.5.1。

4

1 回答 1

1

我们可以做 a!!enexprinfoo2

foo2 <- function(a) {
  print(is_missing(enexpr(a)))
  bar(!!maybe_missing(enexpr(a)))
}

foo2()
#[1] TRUE
#[1] TRUE

foo2(b)
#[1] FALSE
#[1] FALSE
于 2019-03-04T15:17:57.493 回答