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
我缺少明显的东西吗?
答案 0 :(得分:5)
这是因为aes()
接受x
和y
参数,而!!!
仅在点内有效。将来,我们将尝试解决此特定问题。在此期间,您需要分别取消对x
和y
的引用,或使用以下解决方法:
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。