在ggplot自定义函数中使用ggmosaic::product时的准引用问题
在ggplot自定义函数中使用ggmosaic::product时的准引用问题
我完全懂你现在的困惑——在ggplot的aes()里用{{}}做准引用一直顺风顺水,结果到了ggmosaic的product()函数里就直接报错,这种“突然失效”的情况确实挺闹心的。
问题根源
其实问题出在product()这个函数本身:它是ggmosaic包专门实现的工具函数,并没有像ggplot2的aes()那样内置对rlang准引用语法的支持。你在aes(fill = {{var1}})里能用{{}},是因为ggplot2从3.0版本开始就适配了tidyeval规则,但product()内部并没有处理这种语法的逻辑,所以它没法识别你传递的{{var2}},最终抛出了「undefined columns selected」的错误。
解决方案
这里有两种简单有效的修复方式,你可以任选其一:
方法1:用enquo()捕获变量+!!展开
手动用rlang的函数捕获变量引用,再用!!(bang-bang操作符)把变量传递给product():
mosaic_fig<-function(db,var1,var2){ library(ggmosaic) # 捕获输入的变量引用 var2_quo <- enquo(var2) var1_quo <- enquo(var1) mosac <- ggplot2::ggplot(data = db) + geom_mosaic(ggplot2::aes(x = product(!!var2_quo), fill = !!var1_quo)) + ggplot2::labs(y="", x="", title = "") return(mosac) }
方法2:用rlang::ensym()转换变量
如果你的输入是裸变量名(不是表达式),可以用ensym()把输入转换成符号,直接传递给product():
mosaic_fig<-function(db,var1,var2){ library(ggmosaic) mosac <- ggplot2::ggplot(data = db) + geom_mosaic(ggplot2::aes(x = product(rlang::ensym(var2)), fill = {{var1}})) + ggplot2::labs(y="", x="", title = "") return(mosac) }
测试验证
用你提供的测试数据跑一下函数,就能正常生成马赛克图了:
var_1<-rep(c("A","B","C","B","A","C"),10) var_2<-c(rep(c("1","0"),10),rep("0",5),rep(c("0","1","0"),10),rep("1",5) ) dat<-data.frame(var_1,var_2) # 调用函数 mosaic_fig(dat,var_1,var_2)
备注:内容来源于stack exchange,提问作者Francisco
相关产品推荐
相关产品推荐

