引用类(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 ...
随机推荐
- Mantle 与Injection
本来Injection可以本地打补丁实时修改代码,但是不知道Mantle的数据类为何不能打补丁,可能因为Mantle利用了很多运行时的技术吧.
- Hadoop集群安装-CDH5(5台服务器集群)
CDH5包下载:http://archive.cloudera.com/cdh5/ 架构设计: 主机规划: IP Host 部署模块 进程 192.168.254.151 Hadoop-NN-01 N ...
- Windows程序自启动方法汇总
文件夹 一.当前用户专有的启动文件夹 二.对所有用户有效的启动文件夹 三.Load注册键 四.Userinit注册键 五.Explorer\Run注册键 六.RunServicesOnce注册键 七. ...
- 55. Jump Game(贪心)
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- Spring整合ActiveMQ:spring+JMS+ActiveMQ+Tomcat
一.目录结构 相关jar包 二.关键配置activmq.xml <?xml version="1.0" encoding="UTF-8"?> < ...
- kafka监控工具
Kafka Web Conslole Kafka Manager KafkaOffsetMonitor.
- python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码
python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...
- 短网址(short URL)系统的原理及其实现
短网址(short URL)系统的原理及其实现 https://hufangyun.com/2017/short-url/?hmsr=toutiao.io&utm_medium=toutiao ...
- Python装饰器的高级用法(翻译)
原文地址 https://www.codementor.io/python/tutorial/advanced-use-python-decorators-class-function 介绍 我写这篇 ...
- 散列表(HashTable)
散列表 i. 散列函数 i. 冲突解决 ii. 分离链表法 ii. 开放地址法 iii. 线性探测法 iii. 平方探测法 iii. 双散列 ii. 再散列 ii. 可扩散列 i. 装填因子:元素个数 ...