R语言自定义ggplot堆叠柱状图函数出现AES系列报错如何解决?
问题解决思路
错误原因
报错核心是ggplot2的美学映射aes()采用非标准评估机制,封装函数时直接传入列名作为参数,函数内部无法正确识别该参数指向传入数据框中的对应列,因此触发object not found错误。手动添加inherit.aes=FALSE会中断全局美学映射的继承,geom_bar()没有单独定义映射规则就会触发缺少美学参数的报错,不需要设置该参数。
解决方案
1. 调整自定义函数
使用tidy evaluation语法中的卷曲运算符{{ }}捕获传入的列名参数,让ggplot可以正确在传入的数据框中定位对应列,同时可以去掉冗余的print()包裹,函数默认返回ggplot对象即可自动渲染:
library(ggplot2) library(dplyr) cntl <- function(.data, varname, xlabname, maintitle){ ggplot(.data) + aes(x = {{varname}}, fill = progcat) + geom_bar(position = "fill") + scale_fill_manual(name = "Control", values = c("#84c96d", "#cecece", "#000000", "#ffcf5e", "#fa6b37")) + xlab(xlabname) + ylab("Proportion of Cohort") + labs(title = maintitle) + theme(plot.title = element_text(hjust = 0.5)) }
2. 修正调用方式
原调用方式多传入了冗余的dset$age参数,管道操作已经将处理完成的数据集传入函数,直接传入列名作为参数即可:
dset %>% arrange(progcat) %>% mutate(age = factor(age, levels = c("Up to 60", "61+"))) %>% cntl(varname = age, xlabname = "Age", maintitle = "TEST TITLE")
内容的提问来源于stack exchange,提问作者MWolcott
相关产品推荐
相关产品推荐

