参阅《R语言编程艺术》,R语言学习笔记
R中所有的东西(从数字到字符串到矩阵都是对象). R支持“封装”,“多态”,“继承”.
R中原始的类机构即S3类,现在任然在R的使用中占据主导地位。事实上,大多数R中内置的类都是S3类.
一个S3类包含一个列表,再附加上一个类名属性和调度的功能.后者式泛型函数的使用变成可能.R是多态的,在某种意义上说,同一个函数可以针对不同的类调用不同的操作. 即相同的函数使用不同的类对象时可以调用不同的操作. 多态可以促进代码的可重用性.多态使用户更容易记住相应的命令,而且为用户探索新的库函数及其相关的类带来不少方便和乐趣.
rm(list=ls(all=TRUE))
j <- list(name="Joe",salary=5000,union=T)
j
# $name
# [1] "Joe"
# $salary
# [1] 5000
#$union
#[1] TRUE
class(j) <- "employee"
attributes(j)
#$names
#[1] "name" "salary" ""
#$class
#[1] "employee"
print(j)
本质上,j在打印时被当做一个列表。现在编写我们自己的打印方法:
print.employee <- function(wrkr){
cat(wrkr$name,"\n")
cat("salary",wrkr$salsary,"\n")
cat("union member",wrkr$union,"\n")
}
print(j)
#Joe
#salary
#union member TRUE
j
#Joe
#salary
#union member TRUE
使用继承
继承的思想是在已有类的基础上创建新的类,例如,在上例中创建针对小时工的新类"hrlyemployee", 作为“employee”的子类,如下:
k <- list(name="Kate",salary=68000,union=F,hrsthismonth=2)
k
#$name
#[1] "Kate"
#$salary
#[1] 68000
#$union
#[1] FALSE
#$hrsthismonth
#[1] 2
class(k) <- c("hrlyemployee","employee")
k
#Kate
#salary
#union member FALSE
直接键入k即可调用print(k),一旦键入k,就会调用UseMethod(),去查找"hrlyemployee"类的打印方法,这是因为"hrlyemployee"是k的两个类名称的第一个,结果没有找到对应的方法,所以UseMethod()尝试查找另一个类“employee”对应的打印方法,找到print.employee(), 然后执行该函数.