
1.6.1 R语言S3类别
R语言的类别概念是源自于S语言Version 3的原始结构,通常简称S3,至今仍是R语言中最常见的类别范式,许多R语言内置类别亦为S3类型。S3类别通过列表函数list()建立对象,内含属性与属性值的设定,并利用class()函数设定其类别名称。

从前面结果可看出列表对象j具有类别属性,其值为employee。

print()泛型函数可定义类别为employee的具体输出方法print.employee()如下:

接着调用print()泛型函数,传入employee类别对象j,即可依print.employee()方法的设计内容,将对象j输出了。

前述的面向对象多态(polymorphism)是一个重要概念,它与泛型函数有关。plot()是R语言S3面向对象编程中的一个泛型函数,下例根据传入的对象类型,分派(dispatch)相应任务给plot.default()、plot.lm()、plot.ts()等函数进行实际处理。首先创建体重与身高的双栏数据集test,并建立体重对身高的简单线性回归模型test.lm。

接着规划绘图输出布局,layout()函数中号码相同的区域为同一图形输出区域。参照下方矩阵的数值,最上方与最下方的区块各输出一张图形,而中间四个不同的数字,则分配给四张图形。读者可以从结果看出,若传入对象为data.frame,则调用plot.default()绘制散点图;若传入对象为线性模型的结果对象lm类,则调用plot.lm()绘制四个残差诊断图;若传入对象为时间序列ts类,则调用plot.ts()绘制时间序列折线图(图1.10)。


图1.10 S3泛型函数plot()输入不同类型对象所绘制的各种图形

最后,methods()函数可以查看S3泛型函数plot()的所有可用方法,或该类别所有可用方法。此函数类似Python中常用的dir(),可以查询某个模块的功能或对象的方法。

注意:根据每位使用者已经安装的套件不同,methods()函数返回的泛型函数plot()的具体方法或有不同,数量多寡视使用者本机的套件而定。另外,如欲查询特定类别plot方法的说明页面,请以句点语法加注类别名称于泛型函数名称后方,如?plot.lm或?predict.lm。最后,.S3methods('plot')与.S4methods('plot')两函数可以帮助我们区分methods()传回的结果哪个是S3或S4的面向对象泛型函数。