R开发(part12)--基于RC的面向对象编程
学习笔记,仅供参考,有错必纠
参考自:《R的极客理想》-- 张丹
文章目录
- R开发
- 基于RC的面向对象编程
- 创建RC类和对象
- 对象赋值
- 定义对象的方法
- RC对象内置方法和内置属性
- RC类的辅助函数
R开发
基于RC的面向对象编程
RC是Reference classes的简称,又被称为R5,RC不同于原来的S3和S4对象系统,RC对象系统的方法是在类中自定的,而不是泛型函数。RC对象的行为更类似于其他的编程语言,实例化对象的语法也有所改变。但由于RC对象系统还是依赖于S4对象系统,我们可以简单地理解为RC是对S4的更进一步的面向对象封装。
创建RC类和对象
- setRefClass函数
RC对象系统以类为基本类型,有专门的类的定义函数setRefClass和实例化对象的生成方法。
语法:
setRefClass(Class, fields = , contains = , methods =,where =, inheritPackage =, ...)
参数列表:
参数 | 解释 |
---|---|
Class | 定义类名 |
fields | 定义属性和属性类型 |
contains | 定义父类,继承关系 |
methods | 定义类中的方法 |
where | 定义存储空间 |
- 创建RC类和实例
创建一个RC类:
#定义一个RC类
User <- setRefClass("User", fields = list(name = "character"))
实例化一个RC对象:
#实例化一个User对象u1
u1 <- User$new(name = "u1")
u1
#输出start
Reference class object of class "User"
Field "name":
[1] "u1"
#输出endclass(User)
#输出start
[1] "refObjectGenerator"
attr(,"package")
[1] "methods"
#输出endis.object(User) #TRUE
otype(User) #"RC"
class(u1)
#输出start
[1] "User"
attr(,"package")
[1] ".GlobalEnv"
#输出endis.object(u1) #TRUE
otype(u1) #"RC"
- 创建一个有继承关系的RC
#创建RC类User
User <- setRefClass("User", fields = list(name = "character"))#创建User的子类Member
Member<-setRefClass("Member", contains = "User", fields = list(manage = "User"))
#实例化User
manager <- User$new(name = "manager")
#实例化一个Member对象
menber <- Member$new(name = "menber", manage = manager)#查看member对象
menber
#输出start
Reference class object of class "Member"
Field "name":
[1] "menber"
Field "manage":
Reference class object of class "User"
Field "name":
[1] "manager"
#输出end#查看member对象的name属性
menber$name #"menber"
#检查对象的属性类型
otype(menber$name) #"base"
otype(menber$manage) #"RC"
- RC对象的默认值
RC的类有一个指定构造器方法$initialize()
,这个构造器方法在实例化对象时,会自动被运行一次,通过这个构造方法可以设置属性的默认值。
#定义一个RC类, 并设置默认值
User <- setRefClass("User", fields = list(name = "character", level = "numeric"),methods = list(initialize = function(name, level) {print("User::initialize自动执行")name <<- "Huang"level <<- 12}))#实例化对象
u1 <- User$new() #"User::initialize自动执行"
#查看对象u1,属性被增加了默认值
u1
#输出start
Reference class object of class "User"
Field "name":
[1] "Huang"
Field "level":
[1] 12
#输出end
对象赋值
#定义User类
User <- setRefClass("User", fields = list(name = "character", age = "numeric",gender = "factor"))
#定义一个factor类型
genderFactor <- factor(c("F", "M"))
#实例化u1
u1<-User$new(name = "u1", age = 30, gender = genderFactor[1])
#查看age属性值
u1$age #30
u1$gender
#输出start
[1] F
Levels: F M
#输出end
给u1的age属性赋值:
u1$age <- 10
u1$age #10
把u1对象赋值给u2对象:
#把u1赋值给u2对象
u2 <- u1
#查看u2的age属性
u2$age #10
#重新赋值
u1$age <- 20
#查看u1, u2的age属性
u1$age #20
u2$age #20
由于把u1赋值给u2的时候,传递的是u1的实例化对象的引用,而不是值本身,这一点与其他语言中对象赋值是一样的。
如果想进行赋值而不是引用传递,可以用下面的方法实现:
#调用u1的内置方法copy,赋值给u3
u3 <- u1$copy()
#查看u3的age属性
u3$age #20
#重新赋值
u1$age <- 30
#查看u1的age属性,发生改变
u1$age #30
#查看u3的age属性,没有改变
u3$age #20
定义对象的方法
在RC对象系统中,方法可以定义在类的内部,通过实例化的对象完成方法调用。
User <- setRefClass("User", fields = list(name = "character", favorite = "vector"),methods = list(addFavorite = function(x) {favorite <<- c(favorite, x)},delFavorite = function(x) {favorite <<- favorite[-which(favorite == x)]},setFavorite = function(x) {favorite <<- x}))#实例化对象
u1 <- User$new(name = "u1", favorite = c("movie", "football"))
u1$favorite #"movie" "football"
#删除一个兴趣
u1$delFavorite("football")
#增加一个兴趣
u1$addFavorite("reading")
u1$favorite #"movie" "reading"
#重新设置兴趣列表
u1$setFavorite(c("game", "reading"))
u1$favorite #"game" "reading"
RC对象内置方法和内置属性
对于RC的实例化对象,除了我们自己定义的方法,还有几个内置的方法,属性复制赋值时使用的copy方法,就是其中之一。
- 内置方法
内置方法 | 作用 |
---|---|
initialize | 类的初始化函数,用于设置属性的默认值,只能在类定义的方法中使用 |
callSuper | 调用父类的同名方法,只能在类定义的方法中使用 |
copy | 复制实例化对象的所有属性 |
initFields | 给对象的属性赋值 |
field | 查看属性或给属性赋值 |
getClass | 查看对象的类定义 |
getRefClass | 同getClass |
show | 查看当前对象 |
export | 查看属性值,以类为作用域 |
import | 把一个对象的属性值赋值给另一个对象 |
trace | 跟踪对象中方法调用,用于程序debug |
untrace | 取消跟踪 |
usingMethods | 用于实现方法调用,只能在类定义的方法中使用 |
- 内置属性
RC对象实例化后,有两个内置属性。
内置方法 | 作用 |
---|---|
.self
|
实例化对象自身 |
.refClassDef
|
类的定义类型 |
RC类的辅助函数
当我们定义好一个RC的类时,有一些辅助函数可以帮助我们查看类的属性和方法,用于创建实例化的对象的$new()
函数,也属于这类辅助函数.
- 辅助函数
辅助函数 | 含义 |
---|---|
new | 实例化对象 |
help | 查询类中方法的调用 |
methods | 列出类中定义的所有方法 |
fields | 列出类中定义的所有属性 |
lock | 给属性加锁,实例化对象的属性只允许赋值一次,即赋值变量,不可修改 |
trace | 跟踪方法 |
accessors | 给属性生成get/set方法 |
R开发(part12)--基于RC的面向对象编程相关推荐
- R开发(part10)--基于S3的面向对象编程
学习笔记,仅供参考,有错必纠 参考自:<R的极客理想>-- 张丹 文章目录 R开发 面向对象 面向对象的R语言实现 基于S3的面向对象编程 泛型函数和方法调用 查看S3对象的函数 S3对象 ...
- R开发(part11)--基于S4的面向对象编程
学习笔记,仅供参考,有错必纠 参考自:<R的极客理想>-- 张丹 文章目录 R开发 基于S4的面向对象编程 创建S4对象 访问S4对象的属性 S4的泛型函数 查看S4对象的函数 R开发 基 ...
- 基于MATLAB的面向对象编程(1)——类,属性,方法
这里写目录标题 1 入门 1.1 如何把面条抽象成Class 1.2 文件类 2 基于MATLAB的面向对象编程入门 2.1 如何定义一个类(Class) 2.2 创建一个对象 2.3 类的属性 2. ...
- 基于对象和面向对象编程范式辨析和主流编程语言中的应用
基于对象和面向对象编程范式辨析和主流编程语言中的应用 前言 本文的目的是想告诉大家,为什么C++的模板这么强大.为什么Ruby的Duck Typing(像鸭子那样编程)这么强大! 基于对象和面向对象编 ...
- R语言基于R6的面向对象编程
R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在小众领域闪耀着光芒.直到大数据的爆发,R语言变成了一门炙手可 ...
- 基于MATLAB的面向对象编程(5)——对象的保存(save)和载入(load)
文章目录 6 MATLAB对象的保存和载入 6.1 save和load命令 对象的save和load操作 mat文件保存的对象内容. save过程和属性的默认值 保存handle类的对象要检查hand ...
- 基于MATLAB的面向对象编程(4)——类文件
文章目录 5 MATLAB的类文件的组织结构 5.1 如何使用其他文件夹中类的定义 5.2 类的定义和成员方法分开 5.3 类的局部函数 5.4 使用package文件夹管理类 5.5 类方法和函数重 ...
- mcem r语言代码_R语言面向对象编程:S3和R6
R语言面向对象编程:S3和R6 2017-06-10 0 R语言面向对象编程:S3和R6 一.基于S3的面向对象编程 基于S3的面向对象编程是一种基于泛型函数(generic function)的实现 ...
- 面向对象编程(一):类与对象 实训答案
面向对象编程(一):类与对象 实训答案 一.理解面向对象编程 1.下列关于面向对象编程的说法,正确的有:A.只要使用Java语言解决问题,就是在使用面向对象编程思想解决问题.B.对象是个体,从一组具有 ...
最新文章
- 一篇文章能够看懂基础代码之CSS
- html5通html5通,HTML5 history详解
- 百度搜索结果 转换_如何让图片出现在百度搜索结果里出现?
- egg(87)--egg之redis的安装使用
- websocket 带头部信息请求 header_关于websocket跨域的一个奇怪问题
- Cannot forward after response has been committed问题解决及分析
- 15款免费IDE,推荐给开发者
- php文件不写结尾,php文件结尾不写?的好处有哪...-php判断两个日期相差天数的实...-php根据时间显示刚刚,几分钟前,几小时前的实现代码_169IT.COM...
- 准备入手三星s9+,各位有何见解?
- js href的用法
- Struts学习总结(一)---搭建Struts框架
- 轻量级DI框架Guice使用详解
- 在线识别图片中的字体的网站
- C 语言用链表实现集合交并差,集合交差并三种操作的C实现
- 揭开深度跟踪的力量--Unveiling the Power of Deep Tracking (ECCV2018)
- 一次哔哩哔哩面试经历
- 计算机键盘优点,机械键盘有哪些优点
- linux查看wifi网速,无线信号强度解析及linux如何查看wifi信号强弱等
- 18个提高效率的办公软件推荐,收好不谢
- 1-Java面试题-基础篇