- 大数据分析与应用实战:统计机器学习之数据导向编程
- 邹庆士编著
- 722字
- 2022-07-28 20:15:41
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=1739038660-OvGBqMluVFnBraOeHkNLBEn7rslqWRnQ-0-d16ed4dd2be0ac91a285d3d83e7ac024)
从前面结果可看出列表对象j具有类别属性,其值为employee。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P95_20104.jpg?sign=1739038660-z0AyZoTmgF5BOTUMzxX9vcpoteBfqEpQ-0-b0741c288b3e698c30689eebc92160bf)
print()泛型函数可定义类别为employee的具体输出方法print.employee()如下:
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P95_20105.jpg?sign=1739038660-lmyiOVtlww2auNClgYPZDlP5VEsE7cdO-0-e10f5f608a406ad7e70cdff5ca65bb08)
接着调用print()泛型函数,传入employee类别对象j,即可依print.employee()方法的设计内容,将对象j输出了。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P95_20106.jpg?sign=1739038660-GZvyWedH7dYKlAyqt22sb09WAsMVkbOM-0-e8552d000436021ff028ac3e6db31e9e)
前述的面向对象多态(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=1739038660-EmNSK6DeTkGRXRolNAvsCa41o8bFG5gP-0-ccb68f8a92e5780136613a0bb4c4c21c)
接着规划绘图输出布局,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=1739038660-ywKDas1sgYhHRcA8HbK6V9rzT6uPM3xo-0-80655815eb363c2bc21de876ab3315d9)
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P97_4087.jpg?sign=1739038660-HUiiSKmIBQM6G4oAbO4C0tSOCDWcR7Ix-0-0d3ebf12a6cbaf7aaea06002c72f0f87)
图1.10 S3泛型函数plot()输入不同类型对象所绘制的各种图形
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P98_4103.jpg?sign=1739038660-yPrOCIb4HeRvWNE6Xj9U0XRqUBfxQmbR-0-165f40d34fcfac845f0cd652c8f2acd8)
最后,methods()函数可以查看S3泛型函数plot()的所有可用方法,或该类别所有可用方法。此函数类似Python中常用的dir(),可以查询某个模块的功能或对象的方法。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P98_19919.jpg?sign=1739038660-u0J9ktoTR9u03mbcOipKnoA6f8gJHOii-0-1b39203dc744588b9f6744ed09e3e48c)
注意:根据每位使用者已经安装的套件不同,methods()函数返回的泛型函数plot()的具体方法或有不同,数量多寡视使用者本机的套件而定。另外,如欲查询特定类别plot方法的说明页面,请以句点语法加注类别名称于泛型函数名称后方,如?plot.lm或?predict.lm。最后,.S3methods('plot')与.S4methods('plot')两函数可以帮助我们区分methods()传回的结果哪个是S3或S4的面向对象泛型函数。