引用类(RC)
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 中的对象。
引用类(RC)的更多相关文章
- Java中引用类 strong reference .SoftReference 、 WeakReference 和 PhantomReference的区别
当在 Java 2 平台中首次引入 java.lang.ref 包,其中包含 SoftReference . WeakReference 和 PhantomReference 三个引用类,引用类的 ...
- php 克隆和引用类
/*class Ren { public $name; public $sex; function __construct($n,$s) { $this->name=$n; $this-> ...
- JavaScript基本类型值与引用类型值
前言 JS变量可以用来保存两种类型的值:基本类型值和引用类型值.基本类型的值源自一下5种基本数据类型:Underfined.Null.Boolean.Number和String. 基本类型值和引用类型 ...
- 引用类中的enum
引用类中的enum 引用类中的enum,需要加类的域class_name::value_in_enum_name 点击(此处)折叠或打开 #include <stdio.h> #inclu ...
- javascript基础知识3#引用类
引用类 引用类型的只是引用类型的一个实例,在ecmascript当中,引用类型是一种数据结构用于将数据和功能组织在一起,也常被称做类. object类型 构造函数[var o = new object ...
- Java8自定义函数式编程接口和便捷的引用类的构造器及方法
什么是函数编程接口? 约束:抽象方法有且只有一个,即不能有多个抽象方法,在接口中覆写Object类中的public方法(如equal),不算是函数式接口的方法. 被@FunctionalInterfa ...
- javascript变量的引用类型值
JavaScript变量可以用来保存俩种类型的值:基本类型和引用类型值 前言 JS变量可以用来保存两种类型的值:基本类型值和引用类型值.基本类型的值源自一下5种基本数据类型:Underfined.Nu ...
- 0607pm克隆&引用类&加载类&面向对象串讲&函数重载
克隆class Ren{ public $name; public $sex; function __construct($n,$s) { $this->name=$n; $this->s ...
- java import跨包引用类理解
当前类要用其他类时,import具体包路径+.+具体的类 import引入的是被引用类的class文件,所以当我们build path第三方jar包时, 要用他们的类,要把jar包add to bui ...
随机推荐
- .NET MVC model数据验证
MVC提供了很方便的数据验证,只需要在model里加入相关的正则等,那么就会在前台里生成相关的验证脚本.需要引用两个js文件: jquery.validate.min.js jquery.valida ...
- liferay中如何获取实例的id和portletId
在Portlet中request分为两种renderRequet和actionRequest而portlet需要取得实例Id的时候都在renderRequest的时候才可以取到,如下例子 Portle ...
- cocos代码研究(7)即时动作子类学习笔记
理论部分 即时动作是会立即被执行的动作.他们没有持续时间动作(ActionInterval)的持续时间属性.继承自 FiniteTimeAction.被 CallFunc, FlipX, FlipY, ...
- cocos代码研究(2)Label学习笔记
理论部分 Label类继承自Node类,中文翻译文字与字体,通常在应用开发中为模块作为提示和描述的作用,主要有3中不同的创建方式. 1.通过ttf字体包创建,通过指定本地已有的ttf格式的字体文件,创 ...
- linux printf
[root@LocalWeb01 ~]# printf '%s%s%s\n' 1 2 3 41234 [root@LocalWeb01 ~]# printf '%s%s%s' 1 2 3 41234 ...
- Django初级手册3-视图层与URL配置
设计哲学 在Django中一个视图有指定函数和指定模版组成.对于某些特定的应用应该分成若干视图.例如博客系统 Blog主页面 详细页面入口 基于年的页面展示 基于月的页面展示 基于天的页面展示 评论行 ...
- SV中的Interface和Program
Interface:SV中新定义的接口方式,用来简化接口连接,使用时注意在module或program之外定义interface,然后通过'include来添加进工程. interface arb_ ...
- ArcGIS 10——版本编辑流程
上一篇文章学习了ArcGIS有关版本机制实现的基本原理,本文结合ArcGIS的数据编辑知识来将版本编辑.协调.解决冲突.提交更改的整个过程加以说明. 同上篇文章一样,写作本文的初始意图是因为目前的项目 ...
- Linux服务器---mysql忘记root密码
忘记root密码 如果不小心忘记了root密码,那么mysql就不能再登录了,这时就要重置root密码才行.通过下面的步骤,我们可以重新设置root密码. 1.退出mysql [root@localh ...
- POI Excel文件的读取与写入
1. 创建目录 if(!(new File(path).isDirectory())){ new File(path).mkdirs();} 2. 读取Excel文件,并进行写入操作 Workbook ...