- 大数据分析与应用实战:统计机器学习之数据导向编程
- 邹庆士编著
- 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=1739060189-2EILLLPPtoTp5pdoWzuzKWsy7GCsi5mb-0-bd7b9ffe4260ee40e9f3307589dcf272)
从前面结果可看出列表对象j具有类别属性,其值为employee。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P95_20104.jpg?sign=1739060189-OpBmX0W1lc3nMYTK650xMvzPItCeXW7d-0-20f0c5878972caf933b174d65758e870)
print()泛型函数可定义类别为employee的具体输出方法print.employee()如下:
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P95_20105.jpg?sign=1739060189-OuDbyriy7XbsF1UX8OAENMRArC0gc7gU-0-f28679d04a8d5bed44806988558961c5)
接着调用print()泛型函数,传入employee类别对象j,即可依print.employee()方法的设计内容,将对象j输出了。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P95_20106.jpg?sign=1739060189-O5tJ0iYwPUtrT3QAQhbBORDhBpt6Wvmi-0-7c10fec2483e5f15c300daa05d0579c0)
前述的面向对象多态(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=1739060189-bBnk7GQRlq6WbHD3QNpggXnnHEiOjmSU-0-14ded3f41ca9f011b671d4e729828df1)
接着规划绘图输出布局,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=1739060189-3pg9touGM6GmujdG8D61YM2whVFdma64-0-d406deece7fa9b0116351042864fdd47)
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P97_4087.jpg?sign=1739060189-LwKnKxpGcmTXmA18d0yAgyAaXpkGLmRU-0-6ca5ab9a9fe80de0eb2b3cb33164606c)
图1.10 S3泛型函数plot()输入不同类型对象所绘制的各种图形
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P98_4103.jpg?sign=1739060189-8nbLfFIkcbUeYUGAZhstkPJmImLvYaCx-0-3188bd9a9bd9bcad71b2c40a7b0741cf)
最后,methods()函数可以查看S3泛型函数plot()的所有可用方法,或该类别所有可用方法。此函数类似Python中常用的dir(),可以查询某个模块的功能或对象的方法。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P98_19919.jpg?sign=1739060189-fYY6YPQfagJYqAMMI4ZsgBiUNmC9r2hX-0-299a1b6cf3fc2dd6266e2277ac455c7f)
注意:根据每位使用者已经安装的套件不同,methods()函数返回的泛型函数plot()的具体方法或有不同,数量多寡视使用者本机的套件而定。另外,如欲查询特定类别plot方法的说明页面,请以句点语法加注类别名称于泛型函数名称后方,如?plot.lm或?predict.lm。最后,.S3methods('plot')与.S4methods('plot')两函数可以帮助我们区分methods()传回的结果哪个是S3或S4的面向对象泛型函数。