R6
RC 的加强版是 R6 , R6 是一个扩展包,能够实现支持公共和私有字段与方法的更有效
的引用类,还有一些其他强大的功能。
运行以下代码安装这个包:
install.packages("R6")
R6 类允许我们定义类,其行为特征更类似于流行的面向对象编程语言。我们用下面的
代码定义了 Vehicle 类,它既有面向用户的公共字段和方法,也有供内部使用的私有字
段和方法:
library(R6)
Vehicle <- R6Class("Vehicle",
public = list(
name = NA,
model = NA,
initialize = function(name, model) {
if (!missing(name)) self$name <- name
if (!missing(model)) self$model <- model
},
move = function(movement) {
private$start()
private$position <- private$position + movement
private$stop()
},
get_position = function() {
private$position
}
),
private = list(
position = 0,
speed = 0,
start = function() {
cat(self$name, "is starting\n")
private$speed <- 50
},
stop = function() {
cat(self$name, "is stopping\n")
private$speed <- 0
}
))
从用户端,我们只能访问公共字段和方法。只有类方法可以访问私有字段和方法。例
如,尽管 Vehicle 有参数 position,但是我们并不想让用户修改它的值。所以,我们
把它放在了 private 部分,而且通过 get_position( )来显示它的值。这样,用户就
很难从外部修改 position 的值了:
car <- Vehicle$new(name = "Car", model = "A")
car
## <Vehicle>
## Public:
## clone: function (deep = FALSE)
## get_position: function ()
## initialize: function (name, model)
## model: A
## move: function (movement)
## name: Car
## Private:
## position: 0
## speed: 0
## start: function ()
## stop: function ()
上述代码创建了一个 R6 对象实例 car,并将它打印出来,可以看到所有公共与私有
的字段与方法都被展示出来。然后,调用 move( )方法,再使用 get_position( )获取
position 的值,发现 car 的位置已经发生了改变:
car$move(10)
## Car is starting
## Car is stopping
car$get_ _position()
## [1] 10
为了演示 R6 类的继承关系,我们定义一个名为MeteredVehicle 的新类,它能够记录移
动的历史距离之和。为此,我们需要新加一个私有字段distance,然后重写公共字段move,
使其优先调用super$move( )将交通工具移动到正确的位置,并累计移动的绝对距离:
MeteredVehicle <- R6Class("MeteredVehicle",
inherit = Vehicle,
public = list(
move = function(movement) {
super$move(movement)
private$distance <<- private$distance + abs(movement)
},
get_distance = function() {
private$distance
}
),
private = list(
distance = 0
))
现在,我们可以使用MeteredVehicle 做一些试验了。在下面的代码中,我们创建了bus:
bus <- MeteredVehicle$new(name = "Bus", model = "B")
bus
## <MeteredVehicle>
## Inherits from: <Vehicle>
## Public:
## clone: function (deep = FALSE)
## get_distance: function ()
## get_position: function ()
## initialize: function (name, model)
## model: B
## move: function (movement)
## name: Bus
## Private:
## distance: 0
## position: 0
## speed: 0
## start: function ()
## stop: function ()
首先,让 bus 向前移动 10 单位,相应地,位置被改变了,距离也累计了:
bus$move(10)
## Bus is starting
## Bus is stopping
bus$get_ _position()
## [1] 10
bus$get_ _distance()
## [1] 10
然后,再让 bus 向后移动 5 单位。这样,位置又更接近原点了,但是距离累计了所有
的移动,所以距离值变大了:
bus$move(-5)
## Bus is starting
## Bus is stopping
bus$get_ _position()
## [1] 5
bus$get_ _distance()
## [1] 15
R6的更多相关文章
- R语言面向对象编程:S3和R6
一.基于S3的面向对象编程 基于S3的面向对象编程是一种基于泛型函数(generic function)的实现方式. 1.S3函数的创建 S3对象组成:generic(generic FUN)+met ...
- Atitit r2017 r6 doc list on home ntpc.docx
Atitit r2017 r6 doc list on home ntpc.docx 驱动器 D 中的卷是 p2soft 卷的序列号是 9AD0-D3C8 D:\ati\r2017 v4 raf\r2 ...
- WARNING: The host 'r6' could not be looked up with /usr/local/mysql/bin/resolveip.
初始化MySQL数据库提示以下信息: # /usr/local/mysql/scripts/mysql_install_db \ > --defaults-file=/etc/my.cnf \ ...
- 001原始编译全志r6平台tinav3.0.2系统
001原始编译全志r6平台tinav3.0.2系统 2018/6/8 11:32 版本:V1.0 开发板:R6 SDK:tina v3.0.2 1.01原始编译全志r16平台tinav3.0系统: r ...
- KingbaseES R6 集群创建流复制只读副本库案例
一.环境概述 [kingbase@node2 bin]$ ./ksql -U system test ksql (V8.0) Type "help" for help. test= ...
- KingbaseES R6 集群修改物理IP和VIP案例
在用户的实际环境里,可能有时需要修改主机的IP,这就涉及到集群的配置修改.以下以例子的方式,介绍下KingbaseES R6集群如何修改IP. 一.案例测试环境 操作系统: [KINGBASE@nod ...
- KingbaseES R6 集群物理copy方式手工添加新备库节点
案例说明: 对于主库数据量比较大的环境,在添加新节点是可以采用在线clone方式创建新的备库节点,也可以在离线的状态下,直接拷贝其中一个备库的所有集群相关目录来创建新的备库节点.本案例介绍了通过离线物 ...
- KingbaseES R6 手工创建主备流复制案例
数据库版本: TEST=# select version(); version ---------------------------------------------------------- ...
- KingbaseES R6 集群通过备库clone在线添加新节点
案例说明: KingbaseES R6集群可以通过图形化方式在线添加新节点,但是在添加新节点clone环节时,是从主库copy数据到新的节点,这样在生产环境,如果数据量大,将会对主库的网络I/O造成压 ...
随机推荐
- Thinkpad机器BIOS下清除安全芯片和指纹数据的方法
清除安全芯片: 首先在刚开机出现ThinkPad图标时,按F1进入BIOS界面,然后长按关机按钮关机(注意一定是断电的关机,不是重新启动)然后开机再按F1键进入BIOS设置.选择“Securiy”-〉 ...
- 【kafka学习之三】kafka集群运维
kafka集群维护一.kafka集群启停#启动kafka/home/cluster/kafka211/bin/kafka-server-start.sh -daemon /home/cluster/k ...
- python import win32clipboard 报错DLL load failed: %1 不是有效的 Win32 应用程序。
在python中引入win32clipboard时报错,DLL load failed: %1 不是有效的 Win32 应用程序 >>> import win32clipboardT ...
- Linux基础命令---mv
mv 将文件或者目录移动到另一个地方,或者重命名. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法 mv [选项 ...
- Xcode10.x适配的部分问题
因为我们项目是一个Workspace,由若干个库组成(组件化比较碎),又涉及到海外和国内(存在很多差异性),整个项目的编译是由每个库的脚本(每个库生成会支持32位和64位,每次编译前会清除历史缓存), ...
- svn忽略目录,svn忽略app目录add toignore list,避免每次更新很多app的内容下来导出到本地很麻烦
svn忽略目录,svn忽略app目录add toignore list,避免每次更新很多app的内容下来导出到本地很麻烦 ------------------------------ 本人微信公众帐号 ...
- MySQL数据库读写分离、读负载均衡方案选择
MySQL数据库读写分离.读负载均衡方案选择 一.MySQL Cluster外键所关联的记录在别的分片节点中性能很差对需要进行分片的表需要修改引擎Innodb为NDB因此MySQL Cluster不适 ...
- 史上最全的HTML和CSS标签常用命名规则
文件夹主要建立以下文件夹: 1.Images 存放一些网站常用的图片: 2.Css 存放一些CSS文件: 3.Flash 存放一些Flash文件: 4.PSD 存放一些PSD源文件: 5.Temp 存 ...
- web前端----css选择器样式
一.css概述 CSS是Cascading Style Sheets的简称,中文称为层叠样式表,对html标签的渲染和布局 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. 例如 二.c ...
- MySQL Crash Course #21# Chapter 29.30. Database Maintenance & Improving Performance
终于结束这本书了,最后两章的内容在官方文档中都有详细介绍,简单过一遍.. 首先是数据备份,最简单直接的就是用 mysql 的内置工具 mysqldump MySQL 8.0 Reference Man ...