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