У меня есть вызов, хранящийся в переменной. При необходимости вызов происходит по односторонней формуле:
f <- ~ a + b
rhs <- rlang::f_rhs(f)
rhs
#> a + b
Создано в 2020-03-19 с помощью пакета prex (v0.3.0)
Теперь формула может содержать bquote
стиль, экранирующий .()
, и я хочу получить все экранированные имена.
Глядя на исходный код bquote
, я создал эта функция:
escapedNames <- function (expr, where = parent.frame())
{
unquote <- function(e) {
if (is.pairlist(e)) {
NULL
} else if (length(e) <= 1L) {
NULL
} else if (e[[1L]] == as.name(".")) {
deparse(e[[2L]])
} else {
x <- sapply(e, unquote)
unlist(x)
}
}
unquote(substitute(expr))
}
escapedNames(a + .(b) + c)
#> [1] "b"
Как видите, она прекрасно работает для жестко закодированных выражений. Однако я не могу понять, как передавать вызовы, хранящиеся в переменных.
f <- ~ a + .(b)
rhs <- rlang::f_rhs(f)
escapedNames(rhs)
#> NULL
Это, конечно, имеет смысл, поскольку escapedNames
обрабатывает все, что ему дано, как вызов, который я хочу проанализировать, так что он не знает, чтобы расширить rhs
, прежде чем искать имена.
Итак, как я могу решить эту проблему?