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)的更多相关文章

  1. Java中引用类 strong reference .SoftReference 、 WeakReference 和 PhantomReference的区别

      当在 Java 2 平台中首次引入 java.lang.ref 包,其中包含 SoftReference . WeakReference 和 PhantomReference 三个引用类,引用类的 ...

  2. php 克隆和引用类

    /*class Ren { public $name; public $sex; function __construct($n,$s) { $this->name=$n; $this-> ...

  3. JavaScript基本类型值与引用类型值

    前言 JS变量可以用来保存两种类型的值:基本类型值和引用类型值.基本类型的值源自一下5种基本数据类型:Underfined.Null.Boolean.Number和String. 基本类型值和引用类型 ...

  4. 引用类中的enum

    引用类中的enum 引用类中的enum,需要加类的域class_name::value_in_enum_name 点击(此处)折叠或打开 #include <stdio.h> #inclu ...

  5. javascript基础知识3#引用类

    引用类 引用类型的只是引用类型的一个实例,在ecmascript当中,引用类型是一种数据结构用于将数据和功能组织在一起,也常被称做类. object类型 构造函数[var o = new object ...

  6. Java8自定义函数式编程接口和便捷的引用类的构造器及方法

    什么是函数编程接口? 约束:抽象方法有且只有一个,即不能有多个抽象方法,在接口中覆写Object类中的public方法(如equal),不算是函数式接口的方法. 被@FunctionalInterfa ...

  7. javascript变量的引用类型值

    JavaScript变量可以用来保存俩种类型的值:基本类型和引用类型值 前言 JS变量可以用来保存两种类型的值:基本类型值和引用类型值.基本类型的值源自一下5种基本数据类型:Underfined.Nu ...

  8. 0607pm克隆&引用类&加载类&面向对象串讲&函数重载

    克隆class Ren{ public $name; public $sex; function __construct($n,$s) { $this->name=$n; $this->s ...

  9. java import跨包引用类理解

    当前类要用其他类时,import具体包路径+.+具体的类 import引入的是被引用类的class文件,所以当我们build path第三方jar包时, 要用他们的类,要把jar包add to bui ...

随机推荐

  1. eigen quick reference

    参考: http://eigen.tuxfamily.org/dox/AsciiQuickReference.txt // A simple quickref for Eigen. Add anyth ...

  2. [lr] 常用快捷键

    界面基本操作 F5               : 隐藏/显示上部面板 F6               : 隐藏/显示下部面板 F7               : 隐藏/显示左部面板 F8     ...

  3. JVM内存模型:程序计数器

    一.JVM模型概述 java虚拟机(JVM)在java程序运行的过程中,会将它所管理的内存划分为若干个不同的数据区域,这些区域有的随着JVM的启动而创建,有的随着用户线程的启动和结束而建立和销毁.一个 ...

  4. 20154312 曾林 Exp4恶意软件分析

    写在前面 如果把恶意软件比作罪犯的话,怎么看这次实验? 实验目的:以后能够在茫茫人海中找到罪犯. 实验过程:现在以及抓到了一个罪犯,把他放到茫茫人海里去,看看他和普通人有啥区别.这些区别就是罪犯的特征 ...

  5. mysql 替换函数replace()实现mysql 替换字符串

    mysql 替换字符串的实现方法:mysql中replace函数直接替换mysql数据库中某字段中的特定字符串,不再需要自己写函数去替换,用起来非常的方便,mysql 替换函数replace()Upd ...

  6. 文件系统、服务、防火墙、SELINUX——安全四大金刚

    一提到安全,大家都会想到防火墙,和文件系统权限.而实际工作环境中,我们在Linux的安全配置,会涉及到四个级别.我们思考一个场景,你要在百度盘中存放一个文件,这个动作需要考虑下面四个权限. 1 fir ...

  7. 优化 MySQL: 3 个简单的小调整

    我并不期望成为一个专家级的 DBA,但是,在我优化 MySQL 时,我推崇 80/20 原则,明确说就是通过简单的调整一些配置,你可以压榨出高达 80% 的性能提升.尤其是在服务器资源越来越便宜的当下 ...

  8. ELK学习笔记之CentOS 7下ELK(6.2.4)++LogStash+Filebeat+Log4j日志集成环境搭建

    0x00 简介 现在的公司由于绝大部分项目都采用分布式架构,很早就采用ELK了,只不过最近因为额外的工作需要,仔细的研究了分布式系统中,怎么样的日志规范和架构才是合理和能够有效提高问题排查效率的. 经 ...

  9. php检查是否是数字和字母

    /* 检查是否是数字和字母* php内置函数ctype_alnum检查字符串是否是数字和字母,或者两者混合* $string*/ public function is_numandlitter($st ...

  10. JavaScript 中语法规范及调试

    JavaScript 中语法规范及调试 版权声明:未经博主授权,内容严禁分享转载 JavaScript 开发环境 JavaScript 脚本可以使用任意一款纯文本编辑器进行编程开发. 常见的前端开发编 ...