R语言如何调用父类被重写的函数?以geeglm调用plot.lm为例
解答
1. 类继承逻辑的验证
你对S3类继承的理解是正确的,geeglm返回对象的类属性向量按优先级包含geeglm、gee、glm、lm,正常情况下泛型函数plot找不到对应优先级高的方法时,会自动向后匹配lm类的方法。你直接调用plot.lm报错的原因是:plot.lm是stats包的非导出函数,没有暴露在全局工作环境中,无法直接通过函数名调用。
2. 调用父类被重写S3方法的通用方案
以下两种方法适用于所有S3类的同类场景,可直接复用:
- 通用方法:使用
getS3method()获取指定类的方法后调用,不受方法是否导出的限制
要调用lm类的plot方法,写法为getS3method("plot", "lm")(你的geeglm对象),如果要调用glm类的方法,只需要把第二个参数改为"glm"即可。 - 直接访问包非导出方法:使用三个冒号
:::访问对应包的内部非导出函数plot.lm属于stats包,写法为stats:::plot.lm(你的geeglm对象)。
可运行示例代码
library(geepack) A = data.frame(x=rnorm(100),y=rbinom(100,1,.5),id=rbinom(100,1,.2)) g = geeglm(y~x,data=A,id=A$id) # 调用lm类的plot方法的两种写法 getS3method("plot", "lm")(g) stats:::plot.lm(g)
注意:部分
geeglm对象的属性和原生lm对象存在差异,调用时可能出现警告,若出现报错可手动提取对象的拟合值、残差、系数等属性自行绘制诊断图。
内容的提问来源于stack exchange,提问作者jessexknight
相关产品推荐
相关产品推荐

