ggplot封装绘图函数时如何在fct_reorder中传入字符串变量并修正报错?
报错根因
你遇到的报错本质是函数执行时机和参数格式不匹配:
aes_string的设计逻辑是,所有传入的映射内容必须是格式正确的字符串表达式,它会在图层加载到数据环境时,才把这些字符串解析成对应的变量映射。- 你之前写的代码,把
fct_reorder(y, x, ...)直接作为值传给aes_string,R会在函数运行的早期阶段(还没加载数据环境的时候)就直接执行这个fct_reorder函数,此时传入的x、y是字符串"cty"、"drv",根本不是数据框里的有效变量,na.rm参数也因为错误的执行上下文被识别成多余参数,最终抛出未使用参数的报错。
修正方案
兼容aes_string写法
只要把涉及fct_reorder的排序逻辑,拼成完整的字符串表达式传给aes_string即可,不要直接在参数位置写函数调用:
chart_fun <- function(x, y) { # 用sprintf把字符串变量名填充到fct_reorder的表达式模板里,生成完整的映射字符串 y_reorder_expr <- sprintf( "fct_reorder(%s, %s, .fun = mean, na.rm = TRUE)", y, x ) mpg %>% ggplot() + geom_col( aes_string( x = x, y = y_reorder_expr, fill = y ), width = 0.8 ) + theme_classic() } chart_fun(x = "cty", y = "drv")
新版ggplot2推荐写法
aes_string目前已经是软弃用的接口,更稳定的写法是用rlang的符号转换语法,不需要拼接字符串,可读性更强,完全匹配你传入字符串格式变量名的需求:
chart_fun <- function(x, y) { # 把传入的字符串变量名转为ggplot可识别的语法符号 x_var <- rlang::sym(x) y_var <- rlang::sym(y) mpg %>% ggplot() + geom_col( aes( x = !!x_var, y = fct_reorder(!!y_var, !!x_var, .fun = mean, na.rm = TRUE), fill = !!y_var ), width = 0.8 ) + theme_classic() } # 调用逻辑不变,直接传字符串变量名即可 chart_fun(x = "cty", y = "drv")
内容的提问来源于stack exchange,提问作者Geet
相关产品推荐
相关产品推荐

