如何从eval_tidy评估的代码访问.data环境

时间:2018-03-06 01:50:24

标签: r rlang tidyeval

我想使用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}},enexprsubstitute的俚语。我们试试substituteenexpr

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。 (用户应该能够提供以...为参数的任意函数。)

1 个答案:

答案 0 :(得分:0)

您的存在检查需要inherits = TRUE,因为eval_tidy()会将屏蔽数据安装一级。