You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 14:25:29