![大数据分析与应用实战:统计机器学习之数据导向编程](https://wfqqreader-1252317822.image.myqcloud.com/cover/943/44509943/b_44509943.jpg)
1.6.1 R语言S3类别
R语言的类别概念是源自于S语言Version 3的原始结构,通常简称S3,至今仍是R语言中最常见的类别范式,许多R语言内置类别亦为S3类型。S3类别通过列表函数list()建立对象,内含属性与属性值的设定,并利用class()函数设定其类别名称。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P94_19917.jpg?sign=1739086647-zFndSLfcAhjzxnBmLKjRJVkWTk0UwuT2-0-07553ed460770cb35b65e7e8e68a4b46)
从前面结果可看出列表对象j具有类别属性,其值为employee。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P95_20104.jpg?sign=1739086647-6fZDYvHx5HM8KYaJo7q3RQm6x68nXcGE-0-39e9ce471d2bb1fa281aad0abf00a35f)
print()泛型函数可定义类别为employee的具体输出方法print.employee()如下:
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P95_20105.jpg?sign=1739086647-mcwYUW608P6BJi8AlcRLRoMojvwtKuGO-0-3cc34cef0abbc4dfe64b28f5fab7317b)
接着调用print()泛型函数,传入employee类别对象j,即可依print.employee()方法的设计内容,将对象j输出了。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P95_20106.jpg?sign=1739086647-05QEacVlAiSTQGa2gUbguGK43cOn0AcV-0-b79863c98972b985718072f8bc95a1e2)
前述的面向对象多态(polymorphism)是一个重要概念,它与泛型函数有关。plot()是R语言S3面向对象编程中的一个泛型函数,下例根据传入的对象类型,分派(dispatch)相应任务给plot.default()、plot.lm()、plot.ts()等函数进行实际处理。首先创建体重与身高的双栏数据集test,并建立体重对身高的简单线性回归模型test.lm。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P96_20107.jpg?sign=1739086647-yb0n05OtJRWGSlCm2pxgpo32AjNEPmIl-0-77fa4f39d0801fcf9ab152fdab4ec403)
接着规划绘图输出布局,layout()函数中号码相同的区域为同一图形输出区域。参照下方矩阵的数值,最上方与最下方的区块各输出一张图形,而中间四个不同的数字,则分配给四张图形。读者可以从结果看出,若传入对象为data.frame,则调用plot.default()绘制散点图;若传入对象为线性模型的结果对象lm类,则调用plot.lm()绘制四个残差诊断图;若传入对象为时间序列ts类,则调用plot.ts()绘制时间序列折线图(图1.10)。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P96_19918.jpg?sign=1739086647-uW1dc33hL3FvqTJvqEZmHV6n1R0FDUuZ-0-4f08a88041370bc0fea4b3ba4e2c8b6e)
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P97_4087.jpg?sign=1739086647-OYYFzlnxpiBcC4KUgjmYYpdTdWchJi0C-0-0fef13686367cf42f38569e3579b947d)
图1.10 S3泛型函数plot()输入不同类型对象所绘制的各种图形
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P98_4103.jpg?sign=1739086647-0dCJwf5smgSwAEPQPAVsFDKdlTbOWNEf-0-95d9c28aabdce919cafe86724292d6f4)
最后,methods()函数可以查看S3泛型函数plot()的所有可用方法,或该类别所有可用方法。此函数类似Python中常用的dir(),可以查询某个模块的功能或对象的方法。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P98_19919.jpg?sign=1739086647-fTNjfOBkPTObw1z0IK3dBPNKu5afmtUD-0-9f5d4b79f544054afe1999c165a27845)
注意:根据每位使用者已经安装的套件不同,methods()函数返回的泛型函数plot()的具体方法或有不同,数量多寡视使用者本机的套件而定。另外,如欲查询特定类别plot方法的说明页面,请以句点语法加注类别名称于泛型函数名称后方,如?plot.lm或?predict.lm。最后,.S3methods('plot')与.S4methods('plot')两函数可以帮助我们区分methods()传回的结果哪个是S3或S4的面向对象泛型函数。