R 为什么有plot.lm帮助页面,而函数plot.lm不存在

R 为什么有plot.lm帮助页面,而函数plot.lm不存在,r,R,我试图找出lm对象的默认rplot的残差与拟合图中使用了哪种平滑线,因此我通过键入?plot.lm查看帮助页面,因为据我所知,是如何定义不同对象类型的默认行为的 正如所料,有一个帮助页面,但它没有特别提到残差与拟合图中的平滑线,因此我想检查基本代码,通常对于函数,您可以通过在控制台中键入代码(不带括号)来获得代码。但是在控制台中键入plot.lm会导致错误未找到对象“plot.lm”。由于帮助页面说它在stats包中,我也尝试了stats::plot.lm,但没有效果。我尝试了plot和一些pl

我试图找出
lm
对象的默认r
plot
的残差与拟合图中使用了哪种平滑线,因此我通过键入
?plot.lm
查看帮助页面,因为据我所知,
是如何定义不同对象类型的默认行为的

正如所料,有一个帮助页面,但它没有特别提到残差与拟合图中的平滑线,因此我想检查基本代码,通常对于函数,您可以通过在控制台中键入代码(不带括号)来获得代码。但是在控制台中键入
plot.lm
会导致错误
未找到对象“plot.lm”
。由于帮助页面说它在
stats
包中,我也尝试了
stats::plot.lm
,但没有效果。我尝试了
plot
和一些
plot.
变体,如
plot.default
,它们确实存在并给出了代码

为什么有一个
plot.lm
的帮助页面,而似乎没有一个名为
plot.lm
的函数,如果
plot.lm
中没有,那么
lm
对象的打印行为在哪里定义


我认为这与S3和S4方法之间的差异有关,但我对R的这一方面了解得不够,无法理解。

最近我自己在编写一个函数来绘制默认plot时遇到了这个问题。lm()使用ggplot2绘制。从源代码中可以看出,plot.lm()调用panel.smooth(),后者又调用stats::lowess(),其源代码是:

function (x, y = NULL, f = 2/3, iter = 3L, delta = 0.01 * diff(range(x))) 
{
    xy <- xy.coords(x, y, setLab = FALSE)
    o <- order(xy$x)
    x <- as.double(xy$x[o])
    list(x = x, y = .Call(C_lowess, x, as.double(xy$y[o]), f, 
        iter, delta))
}
函数(x,y=NULL,f=2/3,iter=3L,delta=0.01*diff(范围(x)))
{

xy这是一个未导出的S3方法。在控制台键入
stats:::plot.lm
。如果运行
methods(“plot”)
,您将看到
plot.lm
列表,其中包含一个
*
,这意味着它是一个隐藏/未导出的函数,但它确实存在。隐藏通用函数的自定义方法非常常见。还有
getAnywhere(plot.lm)
会找到它的。