《R语言入门与实践》第八章:S3 与 R 面对对象编程

前言

这一章节讲了关于 R 语言依靠 S3 运行的相关知识, R 语言通过对 S3 泛型函数的支持从而实现 OOP(面向对象编程) 的功能
S3 系统主要有三个组成部分;

  1. attribute 属性(类是特殊的属性)
  2. generic function 泛型函数
  3. 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() 函数有两个参数:

  1. 第一个参数为 R 对象
  2. 第二个参数为 R 对象的某个属性

方式三: structure()

功能:新建一个带指定属性的对象,
格式: structure(score(symbols), symbols = symbols)

使用属性

一个对象的属性可以用于将输出结果整合起来.书中的案例为 prize 的 symbol 属性用于 paste() 函数

paste()

格式:
paste(symbols, collapse = " ")
或者 paste(symbols, prize, sep = "\n$")
功能:

  1. 针对同一个对象, 利用 collapse 定义的字符分隔成单个元素的集合
  2. 针对不同对象, 利用 sep 定义的字符将不同的元素分开

cat()

功能:打印不输出双引号,对转义字符进行转义.

🚩generic function 泛型函数

定义:针对不同的场合, 有不同的处理任务的方式的函数,称为 generic function 
本书以 print() 函数为例讲解

print() ——一个泛型函数

术语

方法
定义:泛型函数调用的针对处理具体问题的函数.具有主函数的一般性,专门执行特定的代码.
Usemethod
定义:print 中用于查找并确定方法的函数

具体流程

在调用 print() 函数的时候,具体流程如下:

  1. print() 首先调用 Usemethod 函数
  2. Usemethod 查找第一个参数的 class 属性
  3. Usemethod 检索出针对此 class 属性的对应的方法.
  4. 对该参数调用此方法,得到结果.

S3 方法的自定义

格式:

例如:print.slot
S3 方法的名称分为两个部分,以“.”分隔:

  1. 第一部分为方法对应的函数名
  2. 第二部分为第一个参数的 class 属性

总体格式:
print.slot <- function(x, ...) {
cat("This is using the print.slot method")
}

Usemethod语法(以 print 为例)

  1. 先调用参数的第一个 class 属性,查看是否有相应的方法
  2. 依次检索
  3. 如果没有找到,就使用 print.default 这个方法

🚩 Class 类

使用 class 有两个步骤:

  1. 给 class 起一个名称,并使用 structure() 等方法将 class 赋予给 R 对象
  2. 为该 class 编写泛型函数的类方法

自定义类

格式:参见定义属性

例如: class(object) <- slot

局限

  1. 当将多个对象组合成一个向量时, class(也包括其他属性)被丢弃
  2. 去一个向量的子集时, class(也包括其他属性)也被丢弃





posted @ 2019-04-30 18:03  FBshark  阅读(495)  评论(0编辑  收藏  举报