《R语言入门与实践》第八章:S3 与 R 面对对象编程
前言
这一章节讲了关于 R 语言依靠 S3 运行的相关知识, R 语言通过对 S3 泛型函数的支持从而实现 OOP(面向对象编程) 的功能
S3 系统主要有三个组成部分;
- attribute 属性(类是特殊的属性)
- generic function 泛型函数
- method 方法
🚩attribute ——属性
自定义属性
方式一:
功能:面对一个对象,创建其属性
格式:levels(DECK) <- c("level1", "level2", "level3")
其中, levels 为属性名. DECK 为 R 对象, c("level1", "level2", "level3") 为属性的值
方式二:attr() 函数
功能:面对一个对象,创建其属性.
attr(one_paly, "symbols") <- c("B", "0", "B")
其中, one_play 为对象, "symbols" 为属性名(注意加双引号)
也就是说, attr() 函数有两个参数:
- 第一个参数为 R 对象
- 第二个参数为 R 对象的某个属性
方式三: structure()
功能:新建一个带指定属性的对象,
格式: structure(score(symbols), symbols = symbols)
使用属性
一个对象的属性可以用于将输出结果整合起来.书中的案例为 prize 的 symbol 属性用于 paste() 函数
paste()
格式:
paste(symbols, collapse = " ")
或者 paste(symbols, prize, sep = "\n$")
功能:
- 针对同一个对象, 利用 collapse 定义的字符分隔成单个元素的集合
- 针对不同对象, 利用 sep 定义的字符将不同的元素分开
cat()
功能:打印不输出双引号,对转义字符进行转义.
🚩generic function 泛型函数
定义:针对不同的场合, 有不同的处理任务的方式的函数,称为 generic function
本书以 print() 函数为例讲解
print() ——一个泛型函数
术语
方法
定义:泛型函数调用的针对处理具体问题的函数.具有主函数的一般性,专门执行特定的代码.
Usemethod
定义:print 中用于查找并确定方法的函数
具体流程
在调用 print() 函数的时候,具体流程如下:
- print() 首先调用 Usemethod 函数
- Usemethod 查找第一个参数的 class 属性
- Usemethod 检索出针对此 class 属性的对应的方法.
- 对该参数调用此方法,得到结果.
S3 方法的自定义
格式:
例如:print.slot
S3 方法的名称分为两个部分,以“.”分隔:
- 第一部分为方法对应的函数名
- 第二部分为第一个参数的 class 属性
总体格式:
print.slot <- function(x, ...) {
cat("This is using the print.slot method")
}
Usemethod语法(以 print 为例)
- 先调用参数的第一个 class 属性,查看是否有相应的方法
- 依次检索
- 如果没有找到,就使用 print.default 这个方法
🚩 Class 类
使用 class 有两个步骤:
- 给 class 起一个名称,并使用 structure() 等方法将 class 赋予给 R 对象
- 为该 class 编写泛型函数的类方法
自定义类
格式:参见定义属性
例如: class(object) <- slot
局限
- 当将多个对象组合成一个向量时, class(也包括其他属性)被丢弃
- 去一个向量的子集时, class(也包括其他属性)也被丢弃