处理 rlang::ensym 中引用的 NULL 参数

Handling quoted NULL arguments in rlang::ensym

我想在我的函数中使用带引号的参数,我想允许用户通过将其设置为 NULL 来指定他们不想使用该参数。但是,rlang::ensym 在收到 NULL 参数时会抛出错误。这是我的代码:

f <- function(var){
  rlang::ensym(var)
  return(var + 2)
}

# This works
variable = 2
f(variable)
# This throws an error
f(NULL)

错误信息是:

Error: Only strings can be converted to symbols

我已经尝试在带有 rlang::ensym 的表达式之前添加带有 is.null(var) 的 if 子句,但是当然,这不起作用,因为此时尚未引用变量。

如何检查提供的引用变量是 NULL 以便以不同方式处理它?

如果您需要允许 NULL,首先使用 quosures 会更稳健。然后你可以检查 quosure 看看里面有什么。例如

f <- function(var){
  var <- rlang::enquo(var)
  if (rlang::quo_is_null(var)) {
    var <- NULL
  } else if (rlang::quo_is_symbol(var)) {
    var <- rlang::get_expr(var)
  } else {
    stop(paste("Expected symbol but found", class(rlang::get_expr(var))))
  }
  return(var)
}

还有那个returns

f(variable)
# variable
f(NULL)
# NULL
f(x+1)
# Error in f(x + 1) : Expected symbol but found call

或者您可以使用适合您实际需求的任何逻辑。