2012-02-14 53 views
3

我想重写默认predict.lm功能由于错误:如何覆盖R中的默认S3函数?

library(datasets) 
# Just a regular linear regression 
fit <- lm(mpg~disp+hp+wt+drat, data=mtcars) 
termplot(fit, terms=2, se=T) 

给出了这样的错误:

Error in predict.lm(model, type = "terms", se.fit = se, terms = terms) : 
    subscript out of bounds 

我知道那里的错误是,我已经发送的等待电子邮件核心邮件列表的核准,但同时我想测试我自己的predict.lm函数来解决这个问题。我明白,我需要重新定义预测S3的功能,但在运行此代码时:

setMethod("predict", "lm", predict.lm2) 
getMethod("predict", "lm") 

实现getMethod返回我的新功能,如预期,但termplot仍然运行老的功能。 methods("predict")还显示旧的predict.lm仍然存在,我认为它可能是调用顺序或我需要调整的东西。任何人都知道如何做到这一点?

+0

您可以尝试设置模型的类。 'class(fit)< - c(“lm2”,“lm”)' – James 2012-02-14 10:44:48

+0

然后它抱怨说缺少lm2类的定义 – 2012-02-14 10:55:15

+0

您使用setMethod时不使用S3,而使用S4。这会带来麻烦。 – 2012-02-14 12:42:40

回答

4

@ James的评论建议您定义您自己的lm2类, ,其延伸lm,并实现predict.lm2

class(fit) <- c("lm2", class(fit)) 
predict.lm2 <- function(...) { 
    # The function with your bugfix 
    cat("Inside predict.lm2\n") 
    predict.lm(...) 
} 
termplot(fit, terms=2, se=T) 
+0

谢谢,这几乎解决了这个问题,虽然我的bug修复predict.lm2函数会导致一个小错误:找不到函数“qr.lm” - 我想这是由于lm类的一些内部函数。我如何访问lm的内部功能?我粘贴了我的predict.lm2函数[在pastebin中](http://pastebin.com/FARH1gC0) – 2012-02-14 11:42:30

+2

由于该函数未导出,因此必须明确指定名称空间:'stats ::: qr.lm' ,每次出现。 – 2012-02-14 12:07:52

+0

谢谢,这就像一个魅力 – 2012-02-14 12:19:29