我想使用rlang::eval_tidy()
来评估...
命名空间中mtcars
的函数。
这是一个我想评估的示例函数,借用于assertr。
has_all_names <- function(...){
check_this <- list(...)
parent <- parent.frame()
all(vapply(check_this,
function(x) exists(x, where = parent, inherits = FALSE),
logical(1)))
}
实现这一目标的基础R方式是:
fn_base <- function(expr) {
expr <- substitute(expr)
eval(expr, envir = mtcars, enclos = parent.frame())
}
但我想将eval_tidy
用于其他好处,例如.data
代词。根据{{3}},enexpr
是substitute
的俚语。我们试试substitute
和enexpr
。
fn_rlang_substi <- function(expr) {
expr <- substitute(expr)
rlang::eval_tidy(expr, mtcars, parent.frame())
}
fn_rlang_enexpr <- function(expr) {
expr <- rlang::enexpr(expr)
rlang::eval_tidy(expr, mtcars, parent.frame())
}
fn_base(has_all_names("cyl", "mpg")) # TRUE
fn_rlang_substi(has_all_names("cyl", "mpg")) # FALSE
fn_rlang_enexpr(has_all_names("cyl", "mpg")) # FALSE
发生了什么事?什么是eval_tidy
做不同的事情?
我知道rlang具有处理...
的功能,但在解决这个问题时,我宁愿不修改has_all_names
。 (用户应该能够提供以...
为参数的任意函数。)
答案 0 :(得分:0)
您的存在检查需要inherits = TRUE
,因为eval_tidy()
会将屏蔽数据安装一级。