如何在 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
所以假设我现在想要 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