Tidyeval接线员! ggplot的AES失败

时间:2019-04-23 16:49:50

标签: r ggplot2 tidyeval

The article discussing tidy evaluation in ggplot2给人的印象是aes()现在支持准喹啉。但是,我无法使其与unquote-splice运算符!!!一起使用。

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

我缺少明显的东西吗?

2 个答案:

答案 0 :(得分:5)

这是因为aes()接受xy参数,而!!!仅在点内有效。将来,我们将尝试解决此特定问题。在此期间,您需要分别取消对xy的引用,或使用以下解决方法:

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

ggplot(mtcars, aes2(!!!v)) + geom_point()

答案 1 :(得分:0)

通过新的 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 和 varsworkaround