使用!!!(splice operator)调用ggplot2 geom_point运行失败问题求助
问题原因
aes() 函数原生支持 tidy evaluation 上下文,会自动识别解析 !!! 大爆炸操作符,因此你给aes传参的代码可以正常运行。但geom_point()的普通参数不在tidy evaluation上下文中,!!!操作符无法被识别,才会抛出无效参数类型的报错。
解决方案
只需用rlang::inject()包裹整个geom_point()调用,手动启用tidy evaluation解析即可,修改后可运行的完整代码如下:
library(rlang) library(ggplot2) data(mtcars) data = mtcars assoc = c( "cyl" , "hp" ) names(assoc) = c("x", "y") assoc_lang = rlang::parse_exprs(assoc) gg = ggplot2::ggplot(data, ggplot2::aes(,,,!!! assoc_lang)) params = c( "10", "\"black\"" ) names(params) = c("size", "colour" ) params_lang = rlang::parse_exprs(params) # 核心改动:用inject包裹调用,识别!!!操作符 gg = gg + rlang::inject(ggplot2::geom_point(!!! params_lang)) plot(gg)
更简洁的常量参数写法
如果你传入的都是固定常量,不需要动态解析表达式,可以直接构造参数列表,不需要调用parse_exprs:
library(rlang) library(ggplot2) data(mtcars) data = mtcars assoc = c(x = "cyl", y = "hp") assoc_lang = rlang::parse_exprs(assoc) gg = ggplot2::ggplot(data, ggplot2::aes(,,,!!! assoc_lang)) # 直接构造常量参数列表 params <- list(size = 10, colour = "black") gg = gg + rlang::inject(ggplot2::geom_point(!!! params)) plot(gg)
内容的提问来源于stack exchange,提问作者toshi-san
相关产品推荐
相关产品推荐

