所以,假设现在要在X
中出现{1>}。
library(rlang)
library(purrr)
q <- quo(mean(X))
我知道我可以用expr检查是否相等
q[[2]][[2]] == expr(X)
[1] TRUE
但是我如何迭代或展平quo元素? flatten(q)
不起作用,我无法用于循环,也不知道如何使用purrr
中的某些映射函数。
理想情况下,我想在X是“数据”而不是任何函数时捕获它。
答案 0 :(得分:1)
我使用以下自定义函数将表达式转换为它们的Abstract Syntax Trees (AST):
getAST <- function( ee ) { as.list(ee) %>% purrr::map_if(is.call, getAST) }
由于您正在使用quosures,因此需要一个中间步骤来检索关联的表达式:
## Define a quosure
## Side note: don't use q as a variable name; it conflicts with q()
qsr <- quo( mean(5*X+2) )
## The associated expression
xpr <- rlang::get_expr( qsr )
## ...and its AST
ast <- getAST( xpr )
# List of 2
# $ : symbol mean
# $ :List of 3
# ..$ : symbol +
# ..$ :List of 3
# .. ..$ : symbol *
# .. ..$ : num 5
# .. ..$ : symbol X
# ..$ : num 2
从这里,您可以使用标准技术来找到X
。例如,展平嵌套列表,然后按照您的问题将每个元素与expr(X)
进行比较:
purrr::has_element( unlist(ast), expr(X) )
# [1] TRUE
purrr::map_lgl( unlist(ast), identical, expr(X) )
# [1] FALSE FALSE FALSE FALSE TRUE FALSE