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