Я использую следующую пользовательскую функцию для преобразования выражений в их Абстрактные синтаксические деревья (ASTs):
getAST <- function( ee ) { as.list(ee) %>% purrr::map_if(is.call, getAST) }
Поскольку вы работаете с предложениями, есть промежуточный этап получениясоответствующее выражение:
## 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