前言
本文接上一篇文章 R语言基于S3的面向对象编程,本文继续介绍R语言基于S4的面向对象编程。
S4对象系统具有明显的结构化特征,更适合面向对象的程序设计。Bioconductor社区,以S4对象系统做为基础架构,只接受符合S4定义的R包。
目录
S4对象介绍
创建S4对象
访问对象的属性
S4的泛型函数
查看S4对象的函数
S4对象的使用
1 S4对象介绍
S4对象系统是一种标准的R语言面向对象实现方式,S4对象有明确的类定义,参数定义,参数检查,继承关系,实例化等的面向对象系统的特征。
2 创建S4对象
本文的系统环境
Linux: Ubuntu Server 12.04.2 LTS 64bit
R: 3.0.1 x86_64-pc-linux-gnu
为了方便我们检查对象的类型,引入pryr包作为辅助工具。关于pryr包的介绍,请参考文章:[撬动R内核的高级工具包pryr](http://blog.fens.me/r-pryr/)
# 加载pryr包
> library(pryr)
2.1 如何创建S4对象?
由于S4对象是标准的面向对象实现方式, 有专门的类定义函数 setClass() 和类的实例化函数new() ,我们看一下setClass()和new()是如何动作的。
2.1.1 setClass()
查看setClass的函数定义
setClass(Class, representation, prototype, contains=character(),
validity, access, where, version, sealed, package,
S3methods = FALSE, slots)
参数列表:
Class: 定义类名
slots: 定义属性和属性类型
prototype: 定义属性的默认值
contains=character(): 定义父类,继承关系
validity: 定义属性的类型检查
where: 定义存储空间
sealed: 如果设置TRUE,则同名类不能被再次定义
package: 定义所属的包
S3methods: R3.0.0以后不建议使用
representation R3.0.0以后不建议使用
access R3.0.0以后不建议使用
version R3.0.0以后不建议使用
2.2 创建一个S4对象实例
# 定义一个S4对象
> setClass("Person",slots=list(name="character",age="numeric"))
# 实例化一个Person对象
> father<-new("Person",name="F",age=44)
# 查看father对象,有两个属性name和age
> father
An object of class "Person"
Slot "name":
[1] "F"
Slot "age":
[1] 44
# 查看father对象类型,为Person
> class(father)
[1] "Person"
attr(,"package")
[1] ".GlobalEnv"
# 查看father对象为S4的对象
> otype(father)
[1] "S4"
2.3 创建一个有继承关系的S4对象
# 创建一个S4对象Person
> setClass("Person",slots=list(name="character",age="numeric"))
# 创建Person的子类
> setClass("Son",slots=list(father="Person",mother="Person"),contains="Person")
# 实例化Person对象
> father<-new("Person",name="F",age=44)
> mother<-new("Person",name="M",age=39)
# 实例化一个Son对象
> son<-new("Son",name="S",age=16,father=father,mother=mother)
# 查看son对象的name属性
> son@name
[1] "S"
# 查看son对象的age属性
> son@age
[1] 16
# 查看son对象的father属性
> son@father
An object of class "Person"
Slot "name":
[1] "F"
Slot "age":
[1] 44
# 查看son对象的mother属性
> slot(son,"mother")
An object of class "Person"
Slot "name":
[1] "M"
Slot "age":
[1] 39
# 检查son类型
> otype(son)
[1] "S4"
# 检查son@name属性类型
> otype(son@name)
[1] "primitive"
# 检查son@mother属性类型
> otype(son@mother)
[1] "S4"
# 用isS4(),检查S4对象的类型
> isS4(son)
[1] TRUE
> isS4(son@name)
[1] FALSE
> isS4(son@mother)
[1] TRUE