R 中还有一种具有引用语义的类系统,它更像其他面向对象编程语言中的类系统。
首先,为了定义一个引用类( reference class , RC ),我们要给 setRefClass( )一个
类定义。不像 S4 类系统使用 new( )创建一个对象实例,setRefClass( )会返回一个
对象实例生成器。例如,我们定义一个名为 Vehicle 的类,它有两个字段:一个数值位

置和一个数值距离。我们将这个对象实例生成器赋给一个名为 Vehicle 的变量:
Vehicle <- setRefClass("Vehicle",
fields = list(position = "numeric",distance = "numeric"))
然后使用 Vehicle$new( )创建一个新的 Vehicle 类的对象实例:
car <- Vehicle$new(position = 0, distance = 0)
RC 的字段( field )不同于 S4 的字段( slot ),我们可以使用 $ 来访问 RC 的字段:
car$position
## [1] 0
使用 Vehicle$new( )创建的每个对象实例都是一个具有引用语义的对象,它的行
为融合了 S4 对象和环境的行为特征。
下面这段代码中,我们创建一个函数用于修改一个 Vehicle 类对象的字段。更确切
地说,我们定义了 move( )函数,它修改相对位置,并累积距离,即相对地修改参数
position,将所有的移动累计到参数 distance 上:
move <- function(vehicle, movement) {
vehicle$position <- vehicle$position + movement
vehicle$distance <- vehicle$distance + abs(movement)
}
现在,对car 调用move( ),我们发现创建的对象实例car确实被修改了,而不是被复制:
move(car, 10)
car
## Reference class object of class "Vehicle"
## Field "position":
## [1] 10
## Field "distance":
## [1] 10
因为引用类本身是一个类系统,并且更像一般的面向对象系统,所以最好定义这个类
自己的方法以便更好地使用它:
Vehicle <- setRefClass("Vehicle",
fields = list(position = "numeric", distance = "numeric"),
methods = list(move = function(x) {
stopifnot(is.numeric(x))
position <<- position + x
distance <<- distance + abs(x)
}))
在 S3 系统和 S4 系统中,方法存储在环境中,而 RC 本身包含它的方法。因此,可以
直接调用一个对象实例中的方法。但是,在方法中修改字段的值,要用 << - 而不是 < -。下
面的代码是一个简单的检验,用来检测 RC 对象实例中的方法是否有效,参考对象是否会
被修改:
bus <- Vehicle(position = 0, distance = 0)
bus$move(5)
bus
## Reference class object of class "Vehicle"
## Field "position":
## [1] 5
## Field "distance":
## [1] 5
通过前面的例子,我们发现 RC 更像 C++ 和 Java 中的对象。

最新文章

  1. Groovy入门教程
  2. 管道过滤器模式(Pipe and Filter)与组合模式(修改)
  3. shell编程基础(4)case 与 function
  4. TortoiseGit无法勾选Load Putty Key,该选项为灰色的解决办法
  5. android 获取设备唯一标识完美解决方案
  6. Python——学习笔记
  7. AJP协议总结与分析
  8. iOS 开源库
  9. centos精简系统 源码安装客户端git
  10. JS事件及其兼容用法
  11. 二叉树 java实现
  12. 《java入门第一季》之面向对象匿名内部类面试题
  13. 「HNOI2016」最小公倍数 解题报告
  14. EntityFramework扩展之第三方类库
  15. StringRedisTemplate操作redis数据
  16. WPF的xaml中特殊字符表示
  17. Scala 学习笔记(1)之入门篇
  18. 菜鸟云打印接入Demo
  19. c语言 快速排序
  20. javaSE——字符流

热门文章

  1. ps中的栅格化--引出--矢量图
  2. DirectShow SDK下载
  3. Object之clone
  4. 55. Jump Game(贪心)
  5. zw版【转发&#183;台湾nvp系列Delphi例程】HALCON MirrorImage2
  6. [转]Mac Appium环境安装
  7. 20155227 2016-2017-2 《Java程序设计》第九周学习总结
  8. Linux基础命令---mv
  9. python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字
  10. python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法