LocalReferenceClasses
位于 methods
包(package)。 说明
修改本地参考类methods ReferenceClasses将对象隔离到本地框架。因此,他们这样做不是将更改传播回调用环境。同时,它们在本地使用引用字段语义,避免了应用于标准的自动重复R对象。
当前的实现没有特殊的构造。要创建本地引用类,请使用包含 "localRefClass"
的 contains=
参数调用 setRefClass()
。请参阅下面的示例。
本地参考类本质上与常规函数类一样操作R;也就是说,更改是通过分配进行的,并发生在本地框架中。本质的区别在于替换操作(比如对twiddle
示例中的字段)不会导致整个对象的重复,就像正式类或具有属性或命名列表中的数据的情况一样。目的是允许某些字段中的大对象不会随着其他字段的潜在频繁更改而更改,但不会复制大字段。
用法
setRefClass(Class, fields = , contains = c("localRefClass",....),
methods =, where =, ...)
细节
在当前的实现中,对象的本地化仅部分自动化。使用 $<-
运算符的替换表达式是安全的。
但是,如果类本身的引用方法修改字段(例如使用 <<-
),则必须在调用任何此类方法之前确保该对象对于相关帧而言是本地的。否则,标准参考类行为仍然占主导地位。
有两种方法可以确保局部性。直接的方法是调用对象上的特殊方法x$ensureLocal()
。另一种方法是通过 x$field <- ...
显式修改字段。每个对象只需要其中一个或另一个发生一次,即可触发为引用提供局部性的浅复制。在下面的示例中,我们展示了这两种机制。
不管怎样,本地化必须在任何方法进行更改之前进行。 (最终,一些代码工具的使用至少应该在很大程度上自动化这个过程,尽管在任意情况下可能很难保证成功。)
例子
## class "myIter" has a BigData field for the real (big) data
## and a "twiddle" field for some parameters that it twiddles
## ( for some reason)
myIter <- setRefClass("myIter", contains = "localRefClass",
fields = list(BigData = "numeric", twiddle = "numeric"))
tw <- rnorm(3)
x1 <- myIter(BigData = rnorm(1000), twiddle = tw) # OK, not REALLY big
twiddler <- function(x, n) {
x$ensureLocal() # see the Details. Not really needed in this example
for(i in seq_len(n)) {
x$twiddle <- x$twiddle + rnorm(length(x$twiddle))
## then do something ....
## Snooping in gdb, etc will show that x$BigData is not copied
}
return(x)
}
x2 <- twiddler(x1, 10)
stopifnot(identical(x1$twiddle, tw), !identical(x1$twiddle, x2$twiddle))
作者
John Chambers
相关用法
- R as 强制对象属于某个类
- R language-class 表示未评估语言对象的类
- R className 类名包含对应的包
- R BasicClasses 基本数据类型对应的类
- R callGeneric 从方法调用当前通用函数
- R findClass 查找类定义
- R setOldClass 注册旧式 (S3) 类和继承
- R ReferenceClasses 具有按引用处理的字段的对象(OOP 样式)
- R MethodsList 方法列表对象
- R setGroupGeneric 创建函数的组通用版本
- R StructureClasses 基本结构对应的类
- R showMethods 显示指定函数或类的所有方法
- R getMethod 获取或测试方法的定义
- R slot 正式类对象中的槽
- R S4groupGeneric S4组通用函数
- R methodUtilities 用于方法和 S-Plus 兼容性的实用函数
- R getClass 获取类定义
- R evalSource 使用源文件中的函数定义,无需重新安装包
- R is 对象是来自类吗?
- R isSealedMethod 检查密封方法或类
- R cbind2 按列或行组合两个对象
- R GenericFunctions 管理通用函数的工具
- R dotsMethods 在方法签名中使用...
- R S3Part 包含 S3 类的 S4 类
- R nonStructure-class 基本类型的非结构 S4 类
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Localized Objects based on Reference Classes。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。