【发布时间】:2020-04-22 00:08:10
【问题描述】:
我正在尝试使用ggplot2 创建一个用于创建棒棒糖图的函数。我想将... 中的所有参数传递给geom_point() 中的aes()。但是,我想排除 size 参数 传递到 geom_segment() 内的 aes() (原因很明显,如果您查看下面的 a() 的输出)。因此,我使用rlang::enquos() 捕获...,而不是按原样传递它。在函数a() 中,我将dots 传递给aes() 在ggplot() 中,这没有问题。但是在函数b() 中我得到错误Can't use '!!!' at top level.
我被困在这一点上,希望能提供任何解决此问题的意见。
library(ggplot2)
data("mtcars")
d <- dplyr::count(mtcars, cyl, am)
a <- function(data, x, y, ...) {
x <- rlang::enquo(x)
y <- rlang::enquo(y)
dots <- rlang::enquos(...)
ggplot(data, aes(!!x, !!y, !!!dots)) +
geom_segment(aes(y = 0, xend = !!x, yend = !!y)) +
geom_point()
}
b <- function(data, x, y, ...) {
x <- rlang::enquo(x)
y <- rlang::enquo(y)
dots <- rlang::enquos(...)
segment_args <- dots[names(dots) != "size"]
ggplot(data, aes(!!x, !!y)) +
geom_segment(aes(y = 0, xend = !!x, yend = !!y, !!!segment_args)) +
geom_point(aes(!!!dots))
}
a(d, cyl, n, color = factor(am), size = am)
b(d, cyl, n, color = factor(am), size = am)
#> Error: Can't use `!!!` at top level.
这是我的sessionInfo():
R version 3.5.2 (2018-12-20)
Platform: x86_64-apple-darwin16.7.0 (64-bit)
Running under: macOS Sierra 10.12.1
Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /usr/local/Cellar/openblas/0.3.5/lib/libopenblasp-r0.3.5.dylib
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods
[7] base
other attached packages:
[1] ggplot2_3.2.1
loaded via a namespace (and not attached):
[1] Rcpp_1.0.3 digest_0.6.18 withr_2.1.2
[4] assertthat_0.2.0 crayon_1.3.4 dplyr_0.8.3
[7] grid_3.5.2 R6_2.3.0 gtable_0.2.0
[10] magrittr_1.5 scales_1.0.0 pillar_1.4.2
[13] rlang_0.4.2 lazyeval_0.2.1 rstudioapi_0.10
[16] labeling_0.3 tools_3.5.2 glue_1.3.0
[19] purrr_0.3.3 munsell_0.5.0 compiler_3.5.2
[22] pkgconfig_2.0.2 colorspace_1.4-0 tidyselect_0.2.5
[25] tibble_2.1.3
【问题讨论】:
-
无法复制。请添加您的
sessionInfo。 -
我的 SessionInfo 和你的只有两个关键区别。我正在使用 R 3.6.1(应该没关系)和
lazyeval0.2.2(最可能的原因),尽管这 issue 表明lazyeval被“放弃”以支持整洁的评估。 -
@NelsonGon 更新到
lazyeval的 0.2.2 版没有解决问题。我会尝试更新我的R版本。 -
这不是解释,但似乎在
ggplot()内调用!!!确实算作引用环境,而在geom_point()内调用它则不算 -
@NelsonGon 您在哪个操作系统上运行 R?
标签: r ggplot2 tidyverse rlang non-standard-evaluation