`plot` 如何知道如何在没有进一步说明的情况下绘制对象?
Posted
技术标签:
【中文标题】`plot` 如何知道如何在没有进一步说明的情况下绘制对象?【英文标题】:How does `plot` know how to plot an object without further specification? 【发布时间】:2022-01-16 22:45:02 【问题描述】:使用 R 基函数 plot
,我们只需提供数据即可制作不同的绘图,而无需指定进一步的参数。例如,如果我们绘制一个时间序列,使用plot(my_ts)
调用plot.ts(my_ts)
因为my_ts
是类ts
。
同样,我们可以使用不带任何参数的 plot ANOVA 结果。这里有一些 ANOVA 模型:
data <- data.frame(group = c(rep("group_1",25),rep("group_2",25)), scores = c(runif(25,0,1),runif(25,1.5,2.5)))
mod1 <- aov(scores~group,data=data)
使用plot(mod1)
有效,但plot(summary(mod1))
会导致错误
"xy.coords(x, y, xlabel, ylabel, log) 中的错误: 'x' 是一个列表,但没有组件 'x' 和 'y'"。
似乎plot
函数在尝试自动创建不带任何参数的绘图时查找名为x
和y
的数据。我尝试了names(mod1)
,但找不到任何x
或y
。那么plot(mod1)
工作而plot(summary(mod1))
不工作是怎么来的呢?
【问题讨论】:
因为summary(mod1)
返回一个c类的对象(summary.aov
,listof
)并且没有内置的plot.summary.aov
函数。出于兴趣,您期望显示什么是方差分析的摘要图?
你看到的是S3 method dispatch(或者没有,对于摘要对象)。
@Limey 实际上我的问题不是关于绘制一个 aov 夏季对象,而是关于 S3 方法调度的问题。我构建了一个包,它会根据提供的类做出不同的反应。这就是我的问题的背景。
啊!很公平。
【参考方案1】:
在键入plot(x)
时,根据class(x)
调用了多个方法。这称为方法分派。也可以创建新的自己的方法,例如plot.summary.aov
用于摘要对象:
data <- data.frame(group = c(rep("group_1",25),rep("group_2",25)), scores = c(runif(25,0,1),runif(25,1.5,2.5)))
mod1 <- aov(scores~group,data=data)
plot(mod1)
让我们定义一个新的存根绘图函数
plot.summary.aov <- function(x)
plot(iris)
plot(summary(mod1))
methods(plot)
#> [1] plot.acf* plot.data.frame* plot.decomposed.ts*
#> [4] plot.default plot.dendrogram* plot.density*
#> [7] plot.ecdf plot.factor* plot.formula*
#> [10] plot.function plot.hclust* plot.histogram*
#> [13] plot.HoltWinters* plot.isoreg* plot.lm*
#> [16] plot.medpolish* plot.mlm* plot.ppr*
#> [19] plot.prcomp* plot.princomp* plot.profile.nls*
#> [22] plot.R6* plot.raster* plot.spec*
#> [25] plot.stepfun plot.stl* plot.summary.aov
#> [28] plot.table* plot.ts plot.tskernel*
#> [31] plot.TukeyHSD*
#> see '?methods' for accessing help and source code
【讨论】:
以上是关于`plot` 如何知道如何在没有进一步说明的情况下绘制对象?的主要内容,如果未能解决你的问题,请参考以下文章