R-S3
为什么要有泛型?
语言是有歧义性的(ambiguity),有时需要通过上下文来判断某个单词是什么意思。但是这很有用,我们可以用更少的词汇去阐述一件事。我们可以发现在R中也有许多例子,用于绘图的plot()函数所绘制的图非常取决于我们传递给plot()什么类型的数据。R语言引入泛型函数(generic functions)来处理歧义。
OOP
R语言的S3也是一种面向对象编程(OOP, Object-Oriented Programming),因为发生的动作(action)是由作为参数( argument)传递的对象(object)决定的。
Class
为了实现OOP,我们需要一种方法,让我们可以创建全新类型的对象(object),“类”(class)系统应运而生。要注意由于OOP是在R诞生后才引入的,所以并不是所有R对象都是class系统定义的。但是所有的R对象都有一个隐含(implied)的类,可以用class函数获得。
Objects classes
举几个例子:
向量(Vector)的class有4种,logical
,numeric
,character
and complex
。
矩阵 (Matrix)可能有一个隐含类:array
,如下所示
> class(matrix(1:4, nc = 2))
[1] "matrix" "array"
> class(matrix(letters[1:4], nc = 2))
[1] "matrix" "array"
虽然这两个对象的基本模式(underlying modes)不同,但是都被视为matrix
类
实例化讲解
- 创建一个列表备用
pts <- list(
x = round(rnorm(5), 2),
y = round(rnorm(5), 2))
- 为其附加一个类“coords”
class(pts) <- "coords"
- 构造函数并生成一个对象实例
coords <- function(x, y) {
#加入一些约束,比如x和y要有相同长度
if (length(x) != length(y))
stop("coordinate lengths differ")
#创建这个类的一个实例,并附上类名“coords”
pts <- list(x = x, y = y)
class(pts) <- "coords"
pts
}
pts <- coords(x = round(rnorm(5), 2), y = round(rnorm(5), 2))
pts
- 废弃类信息(discard)
unclass(pts)
- 访问器,提取器(Accessor,extractor)
以便返回类实例中的某组件
这比每次都要通过$
提取出某一对象的某一组件要好很多
xcoords <- function(obj) obj$x
ycoords <-