设为首页 加入收藏

TOP

R语言面向对象编程:S3和R6(二)
2017-10-10 12:08:44 】 浏览:3071
Tags:语言 面向 对象 编程
eld } else { assert_is_a_string(value) # or another assertion private$..a_field <- value } } ) )

 将active binding作为数据变量而不是函数进行调用。

 a_thing <- thing_factory$new()

a_thing$a_field # not a_thing$a_field()

 

3、R6的继承 

(1)子类的创建

继承将一个类(class)的功能复制到另一个。可在R6Class()中用inherit参数来创建子类。

child_class_factory <- R6Class(
"ChildClass",
inherit = parent_class_factory
)

子类可以添加公有方法来扩展父类的功能,并在公有方法中使用前缀self$调用其他公有方法。

子类也可定义与父类相同的方法名称来重写该方法,用于扩展父类的功能,子类使用前缀super$访问父类的公有方法。

(2)跨级访问

R6类默认只能使用直接父类的功能。为了跨级访问,中间类(intermediate classes)首先需要定义一个active binding来显示父类,形式如下:

active = list(super_ = function() super)

然后可以跨级使用方法parent_method <- super$method()grand_parent_method <- super$super_$method(great_grand_parent_method <- super$super_$super_$method()


(3)共享域


大部分类型的R变量是通过值复制,意思是当复制一个变量时 ,新的变量具有自己的复制值,改变其中一个变量不会影响另外一个。
环境变量(Environments)比较特殊,通过地址传送来复制(by reference),因此所有的复制品都是等同的,改变其中一个就会改变其他变量。
R6类可利用环境的地址传送(by reference)复制行为在对象之间共享区域,定义一个名为shared的私域,方式如下:
创建一个新的环境,指定该环境的任意共享域,可通过active bindings访问。

工作方式与其他active bindings相同,但需使用private$shared$前缀来找回(retrieve)这些区域
R6Class(
"Thing",
private = list(
shared = {
e <- new.env()
e$a_shared_field <- 123
e
}
),
active = list(
a_shared_field = function(value) {
if(missing(value)) {
private$shared$a_shared_field
} else {
private$shared$a_shared_field <- value
}
}
)
)

 

(4)R6对象的复制 

R6对象使用与环境变量相同的地址传送复制方式,如果使用<- 符号复制R6对象,原对象的变化会影响复制品。
a_reference_copy <- an_r6_object
R6 对象有一个自动生成的clone() 方法,用于值复制,使用clone()复制的对象的变化不影响其他对象。
a_value <- an_r6_object$clone()

当R6对象的一个或多个域包含另一个R6对象时,默认clone() 通过地址传送复制该R6域。

如果值复制这些R6域,clone() 方法必须使用参数:deep = TRUE。
a_deep_copy <- an_r6_object$clone(deep = TRUE)


(5)R6对象的消除

当消除对象时,定义公有finalize()方法运行自定义代码。该方法一般用于关闭与数据库或文件的连接,或者消除例如改变全局选项(option)或者图形参数的副作用。

thing_factory <- R6Class(
"Thing",
public = list(
initialize = function(x, y, z) {
# do something
},
finalize = function() {
# undo something
# Print a message
"Disconnecting from the cooking times database."
# Disconnect from the database
dbDisconnect(private$conn) } ) ) 

当R的自动垃圾回收器(automated garbage collector)从存储中清除对象时调用finalize() 方法,可使用gc()强制垃圾回收。

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇R的变量类型和常用函数 下一篇R语言简介

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目