R语言循环中调用含formula的anova_table函数报错求助
问题原因分析
你的anova_table函数依赖deparse(substitute(dv))提取传入参数的字面名称,但循环中传入的是sym类型的对象,substitute(var)得到的是符号var而非实际变量名,最终构造的公式变成了var ~ drv——而你的数据集里并没有名为var的列,因此触发"object is not a matrix"的错误。
解决方案
提供两种可行的修复方式,按需选择:
方法一:修改函数兼容字符串输入
重新定义函数,让它同时支持裸变量名和字符串变量名的输入,这样循环直接用字符串列表即可,无需转换为符号:
anova_table <- function(df, dv, group){ # 处理因变量:如果是字符串直接使用,否则提取变量名 dv_t <- if (is.character(dv)) dv else deparse(substitute(dv)) # 处理分组变量:逻辑同上 group_t <- if (is.character(group)) group else deparse(substitute(group)) anova <- oneway.test( formula = formula(paste(dv_t, "~", group_t)), data = df, var.equal = FALSE ) return(anova) }
简化后的循环代码:
data("mpg") mpg <- mpg %>% mutate_if(is.character, as.factor) # 直接获取数值变量的名称字符串 vars_sel <- mpg %>% select(where(is.numeric)) %>% names() for(var in vars_sel){ # 因变量传字符串,分组变量可以传字符串或裸名 print(anova_table(mpg, var, "drv")) }
方法二:不修改函数,用!!展开符号对象
如果不想改动原函数,在循环调用时用!!(bang-bang运算符)将sym对象展开为裸变量名,让substitute能正确提取变量名称:
data("mpg") mpg <- mpg %>% mutate_if(is.character, as.factor) vars_sel <- mpg %>% select(where(is.numeric)) %>% names() vars_sel <- syms(vars_sel) for(i in vars_sel){ # 用!!i展开符号对象 print(anova_table(mpg, !!i, drv)) }
两种方法都能解决循环调用的报错问题,且不影响原函数在循环外的正常使用。
内容的提问来源于stack exchange,提问作者Fernanda Peres
相关产品推荐
相关产品推荐

