當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。