R语言函数调用shapiro_test()报错:指定列不存在问题求助
问题解决:rstatix shapiro_test 列不存在报错
报错原因
原函数中shapiro_test(.data[[var]])在分组后的map处理阶段无法正确解析列引用,rstatix的分组统计函数对tidy eval语法的支持更友好,直接用.data[[var]]会导致内部作用域找不到目标列。
修改后的函数方案
方案1:直接传入列名(无需引号)
将数据框作为参数传入函数,使用{{var}}实现tidy eval插值:
library(dplyr) library(rstatix) line_graph <- function(df, var) { Normality <- df %>% group_by(Treatment, Time_point_secs) %>% filter(n_distinct({{var}}) > 1) %>% shapiro_test({{var}}) return(Normality) } # 调用示例 line_graph(your_dataframe, Pellet)
方案2:支持字符串形式传入列名
如果需要传入字符串(如"Pellet"),用ensym()转换为符号后使用!!插值:
library(dplyr) library(rstatix) line_graph <- function(df, var) { var_sym <- ensym(var) # 自动识别字符串或裸列名 Normality <- df %>% group_by(Treatment, Time_point_secs) %>% filter(n_distinct(!!var_sym) > 1) %>% shapiro_test(!!var_sym) return(Normality) } # 两种调用方式都兼容 line_graph(your_dataframe, Pellet) line_graph(your_dataframe, "Pellet")
额外注意事项
- 确保数据框
df确实包含目标列,可通过colnames(df)验证列名是否正确 - 函数中传入数据框参数(而非依赖全局环境的
df),能避免作用域冲突,提升代码复用性
内容的提问来源于stack exchange,提问作者JLit98
相关产品推荐
相关产品推荐

