R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。
R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。
要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域。让我们一起动起来吧,开始R的极客理想。
关于作者:
- 张丹(Conan), 程序员Java,R,PHP,Javascript
- weibo:@Conan_Z
- blog: http://blog.fens.me
- email: bsspirit@gmail.com
转载请注明出处:
http://blog.fens.me/r-class-s4/
前言
本文接上一篇文章 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 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 mother son 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]