如何在R中量化Rlang的元素内部

时间:2018-10-01 12:01:51

标签: r purrr rlang

所以,假设现在要在X中出现{}。

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

我知道我可以用expr检查是否相等

q[[2]][[2]] == expr(X)
[1] TRUE

但是我如何迭代或展平quo元素? flatten(q)不起作用,我无法用于循环,也不知道如何使用purrr中的某些映射函数。

理想情况下,我想在X是“数据”而不是任何函数时捕获它。

1 个答案:

答案 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