R中do.call调用anova附加参数运行报错的实现方法
问题核心原因
do.call的传参逻辑要求,第二个参数传入的列表中,每个列表元素都是目标函数可以直接接收的独立入参。
你之前的写法do.call("anova", list(Poly.fits, test = "F")) 生成的传参列表有两个元素:第一个元素是整个存了5个模型的Poly.fits大列表,第二个元素是test="F"。这相当于让anova直接接收一个装着模型的列表作为第一入参,而anova的泛型方法并不支持列表类型的输入,因此抛出了“找不到对应方法”的错误。
之前你跑通的do.call("anova", Poly.fits) 没有报错,就是因为Poly.fits本身就是由5个模型组成的列表,do.call会自动把每个列表元素拆成独立的函数入参,相当于手动逐个传入5个模型。这个写法唯一的不足就是没机会传入test = "F"这类额外参数。
正确实现代码
只需要把存储模型的Poly.fits列表和额外参数列表合并,让最终传给do.call的参数列表拆解开之后等价于你手动写的完整anova调用即可,常用的写法有两种:
- 利用基础R的
c()做列表拼接(最常用):
do.call(anova, c(Poly.fits, list(test = "F")))
- 利用
append()做列表追加:
do.call("anova", append(Poly.fits, list(test = "F")))
运行逻辑说明
两种写法的最终传参结构完全一致:
- 合并后的参数列表长度为6,前5个元素是你存放在Poly.fits里的5个lm模型对象,会被do.call自动拆成anova的前5个位置参数;
- 最后一个元素是命名参数
test = "F",会被作为anova的额外关键字参数传入; - 最终的调用效果和你手动写的
anova(Poly.fits[[1]], Poly.fits[[2]], Poly.fits[[3]], Poly.fits[[4]], Poly.fits[[5]], test = "F")完全等价,运行后会自动输出嵌套模型对比的F检验结果。
内容的提问来源于stack exchange,提问作者Victor Feagins
相关产品推荐
相关产品推荐

