当前位置: 首页>>编程示例 >>用法及示例精选 >>正文


R LocalReferenceClasses 基于参考类的本地化对象

R语言 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-devel大神的英文原创作品 Localized Objects based on Reference Classes。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。