如何在 R 中迭代 rlang 的 quosure 的元素

how to iterate inside the elements of a quosure of rlang in R

所以假设我现在想要 X 出现在 quosure 中。

library(rlang)
library(purrr)
q <- quo(mean(X))

我知道我可以用 expr

检查是否相等
q[[2]][[2]] == expr(X)
[1] TRUE

但是如何迭代或展平现状元素? flatten(q) 不起作用,我不能使用循环,不知道如何使用 purrr.

中的某些映射函数

理想情况下,我想在 "data" 而不是任何函数时捕获 X。

我使用以下自定义函数将表达式转换为它们的 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