处理 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
或者您可以使用适合您实际需求的任何逻辑。
我想在我的函数中使用带引号的参数,我想允许用户通过将其设置为 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
或者您可以使用适合您实际需求的任何逻辑。