自定义R语言误差棒函数无法正常工作该如何修复?
问题描述
我尝试编写一个基于分组因子和数值快速生成误差棒的函数,代码如下:
函数代码
quick.error <- function(data,x,y){ d <- data plot.d <- d %>% mutate(x = as.factor(x)) %>% group_by(x) %>% summarise( sd = sd(y, na.rm = TRUE), mean = mean(y, na.rm=TRUE) ) %>% ggplot(aes(x, mean, fill=x)) + geom_col(color = "black") + geom_errorbar(aes(ymin = mean-sd, ymax = mean+sd), width = 0.2) + theme(legend.position = "none") return(plot.d) }
测试场景1:直接传入列名
调用代码:
quick.error(data=iris, x=Species, y=Petal.Length)
报错信息:
Error in
mutate():
! Problem while computingx = as.factor(x).
Caused by error inis.factor():
! object 'Species' not found
测试场景2:用$显式调用列
调用代码:
quick.error(data=iris, x=iris$Species, y=iris$Petal.Length)
结果:所有柱状图高度一致,分组均值计算未按预期执行。
修复方案
问题根源是函数未正确处理非标准求值(NSE):直接传列名时,函数无法识别数据框内的列;用$传值时,列与数据框的关联丢失,导致分组逻辑失效。
修复后的函数:
library(dplyr) library(ggplot2) quick.error <- function(data, x, y) { plot.d <- data %>% # 使用{{}}捕获列名,关联数据框 mutate({{x}} := as.factor({{x}})) %>% group_by({{x}}) %>% summarise( sd = sd({{y}}, na.rm = TRUE), mean = mean({{y}}, na.rm = TRUE) ) %>% ggplot(aes(x = {{x}}, y = mean, fill = {{x}})) + geom_col(color = "black") + geom_errorbar(aes(ymin = mean - sd, ymax = mean + sd), width = 0.2) + theme(legend.position = "none") return(plot.d) }
修复细节
{{}}的作用:这是tidyverse处理非标准求值的标准语法,能捕获传入的列名并将其与数据框绑定,让函数正确识别列。- 修正aes映射:明确指定
x=和y=参数,避免语法歧义。 - 简化代码:移除多余的
d <- data赋值,直接使用传入的data参数。
验证测试
调用修复后的函数:
quick.error(data=iris, x=Species, y=Petal.Length)
此时可正常生成按Species分组的均值柱状图,误差棒正确对应每组的标准差。
内容的提问来源于stack exchange,提问作者Shawn Hemelstrand
相关产品推荐
相关产品推荐

