Tidyeval оператор сварки !!! не работает с aes ggplot

Статья, посвященная аккуратной оценке в ggplot2, создает впечатление, что aes() теперь поддерживает квазиквотацию. Однако у меня возникают проблемы с его работой с оператором без кавычек !!!.

library( ggplot2 )

## Predefine the mapping of symbols to aesthetics
v <- rlang::exprs( x=wt, y=mpg )

## Symbol-by-symbol unquoting works without problems
ggplot( mtcars, aes(!!v$x, !!v$y) ) + geom_point()

## But unquote splicing doesn't...
ggplot( mtcars, aes(!!!v) ) + geom_point()
# Error: Can't use `!!!` at top level
# Call `rlang::last_error()` to see a backtrace

(Возможно, неудивительно) То же самое происходит, если эстетическое отображение перемещается в геометрию:

ggplot( mtcars ) + geom_point( aes(!!v$x, !!v$y) )   # works
ggplot( mtcars ) + geom_point( aes(!!!v) )           # doesn't

Я упускаю что-то очевидное?


person Artem Sokolov    schedule 23.04.2019    source источник


Ответы (2)


Это потому, что aes() принимает аргументы x и y, а !!! работает только в точках. Мы постараемся решить именно эту проблему в будущем. Тем временем вам нужно будет отменить кавычки x и y по отдельности или использовать следующий обходной путь:

aes2 <- function(...) {
  eval(expr(aes(!!!enquos(...))))
}

ggplot(mtcars, aes2(!!!v)) + geom_point()
person Lionel Henry    schedule 23.04.2019
comment
Спасибо, @lionel. - person Artem Sokolov; 23.04.2019

с новым обновлением rlang, я думаю, вы можете использовать {{}} для работы внутри ggplot

polo<- function(x,y, data, by) {

  ggplot({{data}}, aes(x = {{x}}, y = {{y}})) + 
    geom_point()  + 
    facet_grid(rows = vars({{by}}))
}
polo(data = mtcars, x = cyl, y = mpg, by = vs )

Единственная проблема, с которой я сталкиваюсь, - это использование facet_wrap. Я пробовал quo_name, но, похоже, это не работает с facet_wrap (~ quo_name (by)). В остальном все остальное просто работает. Хотя это также может помочь, но я предпочитаю использовать facet_grid и vars временное решение.

person sitendu goswami    schedule 25.05.2021