R 如何从eval_评估的代码访问数据环境

R 如何从eval_评估的代码访问数据环境,r,rlang,tidyeval,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 =

我想使用
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)))
}
发生什么事了?
eval\u tidy
有什么不同之处


我知道rlang有处理
的功能,但为了解决这个问题,我不想修改
的has\u all\u name
。(用户应该能够提供一个以
为参数的任意函数。)

您需要在存在检查中使用
inherits=TRUE
,因为
eval\u tidy()
将屏蔽数据安装到更高的级别。

我认为
inherits=TRUE
不适合这里,因为我不希望代码搜索整个环境堆栈。(
has_all_name
专门检查父环境中的对象,而不是其他任何对象。)是否有一种好方法可以使用
parent.frame
sys.frame
专门访问数据掩码?访问数据掩码的方法是
parent$.top\u env$.data
。这与我原来的问题略有不同,但解决了问题。注意
。top_env
不是公共API的一部分,因此可能会使您的代码变得脆弱,尽管没有删除它的计划。我会更改您问题的标题,因为它不是关于点的。
fn_base <- function(expr) {
    expr <- substitute(expr)
    eval(expr, envir = mtcars, enclos = parent.frame())
}
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