我正在尝试创建一个使用
这是我的
ggplot2
创建棒棒糖图的函数。我想将所有参数传递到geom_point()
中的aes()
中,但是我想从传递到geom_segment()
中的aes()
中排除size
参数(如果您查看下面a()
的输出,很明显为什么)。因此,我使用rlang::enquos()
捕获...
,而不是直接传递它。在我将dots
传递给ggplot()
中的aes()
的函数a()
中,这个方法没有问题。但是在函数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
lazyeval
0.2.2(最有可能的原因),尽管这个问题表明,lazyeval
已被"放弃",转而使用tidy eval。 - NelsonGonlazyeval
版本0.2.2并没有解决问题。我将尝试更新我的R
版本。 - Thomas Neitmannggplot()
中调用!!!
算作引用环境,而在geom_point()
中调用则不算。 - Romain