UseMethod
位於 base
包(package)。 說明
R擁有簡單的通用函數機製,可用於麵向對象的編程風格。方法調度基於泛型函數的第一個參數的類或作為參數提供的對象的類進行UseMethod
或者NextMethod
.
用法
UseMethod(generic, object)
NextMethod(generic = NULL, object = NULL, ...)
參數
generic |
命名函數的字符串(而不是內置運算符)。 |
object |
對於 |
... |
要傳遞給下一個方法的更多參數。 |
細節
一個Robject 是一個數據對象,它有一個class
屬性(這可以通過is.object
)。類屬性是一個字符向量,給出對象所屬類的名稱繼承.
如果對象沒有類屬性,則它有一個隱式類。矩陣和數組有類"matrix"
或者"array"
接下來是基礎向量的類別。大多數向量的結果類別為mode(x)
,除了整數向量有類c("integer", "numeric")
和實向量有類c("double", "numeric")
。函數.class2(x)
(自從R4.0.x) 返回完整的隱式(或顯式)類向量x
.
當調用 UseMethod("fun")
的函數應用於具有類向量 c("first", "second")
的對象時,係統會搜索名為 fun.first
的函數,如果找到,則將其應用於該對象。如果沒有找到這樣的函數,則會嘗試名為fun.second
的函數。如果沒有類名生成合適的函數,則使用函數fun.default
(如果存在),否則會產生錯誤。
函數 methods
可用於查找特定通用函數或類的方法。
UseMethod
是一個原始函數,但使用標準參數匹配。它不是方法調度的唯一方式,因為還有internal generic和group generic函數。 UseMethod
當前即使對於不是對象的參數也會在隱式類上分派,但其他分派方式則不會。
NextMethod
調用下一個方法(由類向量確定,或者是提供給泛型的對象,或者是包含 NextMethod
的函數的第一個參數(如果直接調用方法)。通常 NextMethod
僅與一個參數一起使用, generic
,但如果提供更多參數,這些參數將修改對下一個方法的調用。
NextMethod
不應被調用,除非在 UseMethod
或內部泛型調用的方法中(請參閱 InternalGenerics )。特別是它不能在匿名調用函數中工作(例如 get("print.ts")(AirPassengers)
)。
命名空間可以注冊通用函數的方法。為了支持這一點,UseMethod
和NextMethod
在兩個地方搜索方法:在調用泛型函數的環境中,以及在定義泛型的環境(通常是命名空間)的注冊數據庫中。因此,泛型函數的方法需要在泛型調用的環境中可用,或者必須注冊它們。 (它們在定義泛型的環境中是否可見並不重要。)R3.5.0,頂級環境後搜索注冊數據庫(見topenv
) 的調用環境(但在頂級環境的父環境之前)。
技術細節
現在一些需要出現在某處的晦澀細節。這些評論與Chambers(1992)中的評論略有不同。 (另請參閱“R 語言定義”草案。)UseMethod
創建一個新的函數調用,其參數在進入泛型時匹配。在調用 UseMethod
之前定義的任何局部變量都將被保留(與 S 不同)。調用 UseMethod
之後的任何語句都不會被計算,因為 UseMethod
不會返回。 UseMethod
可以使用兩個以上的參數調用:將給出警告並忽略其他參數。 (它們在 S 中並未完全被忽略。)如果僅使用一個參數調用它,則封閉函數的第一個參數的類將用作 object
:與 S 不同,這是傳遞的第一個實際參數,而不是當前值該名稱的對象的。
NextMethod
的工作原理是為下一個方法創建一個特殊的調用框架。如果沒有提供新的參數,這些參數的數量、順序和名稱將與當前方法的參數相同,但它們的值將被承諾在當前方法和環境中計算它們的名稱。與 ...
匹配的任何命名參數都會進行特殊處理:它們或者替換同名的現有參數,或者附加到參數列表中。它們作為 Promise 傳遞,作為當前環境的參數提供。 (S 的做法有所不同!)如果它們已在當前(或之前的環境)中進行了評估,那麽它們將保持評估狀態。 (這是一個複雜的領域,可能會發生變化:請參閱“R 語言定義”草案。)
NextMethod
的方法搜索與 UseMethod
的方法搜索略有不同。沒有找到 fun.default
並不一定是錯誤,因為搜索會繼續到泛型本身。這是為了選取像 [
這樣的 internal generic,它沒有單獨的默認方法,並且僅當泛型是 primitive 函數或同名 .Internal
函數的包裝器時才會成功。 (當調用原語作為默認方法時,由於原語的語義不同,參數匹配可能無法按上述方式工作。)
您將看到方法中使用的對象,例如 .Generic
、 .Method
和 .Class
。這些是在調度機製評估方法的環境中設置的,如下所示:
-
找到調用函數(通用函數)的上下文:這為我們提供了原始調用的未計算參數。
-
評估用於調度的對象(通常是參數),並找到一個方法(可能是默認方法)或拋出錯誤。
-
創建一個用於評估該方法的環境,並將特殊變量(見下文)插入該環境中。還要複製泛型環境中非形式(或實際)參數的任何變量。
-
將參數列表修複為與方法的形式匹配的調用參數。
.Generic
是命名通用函數的長度為 1 的字符向量。
.Method
是命名方法函數的字符向量(通常長度為 1)。 (對於通用組 Ops
中的函數,其長度為 2。)
.Class
是用於查找下一個方法的類的字符向量。 NextMethod
將屬性 "previous"
添加到 .Class
,給出上次用於調度的 .Class
,並將 .Class
移至用於調度的屬性。
.GenericCallEnv
和.GenericDefEnv
分別是調用泛型和定義泛型的環境。 (後者用於查找為泛型注冊的方法。)
請注意,.Class
在調用泛型時設置,並且如果在方法中更改調度參數的類,則 .Class
保持不變。可以通過操作 .Class
來更改 NextMethod
分派的方法,但“除非您徹底了解繼承機製,否則不建議這樣做”(Chambers & Hastie,1992,第 469 頁)。
注意
該方案稱為S3(S版本3)。對於新項目,建議使用methods
包中提供的更靈活、更健壯的S4方案。
參考
Chambers, J. M. (1992) Classes and methods: object-oriented programming in S. Appendix A of Statistical Models in S eds J. M. Chambers and T. J. Hastie, Wadsworth & Brooks/Cole.
也可以看看
“R 語言定義”草案。
methods
、class
包括.class2()
; getS3method
、is.object
。
相關用法
- R file.path 構造文件路徑
- R grep 模式匹配和替換
- R getwd 獲取或設置工作目錄
- R vector 向量 - 創建、強製等
- R lapply 對列表或向量應用函數
- R dump R 對象的文本表示
- R Sys.getenv 獲取環境變量
- R rank 樣本排名
- R getDLLRegisteredRoutines DLL 中 C/Fortran 例程的反射信息
- R pushBack 將文本推回連接
- R strsplit 分割字符向量的元素
- R seq.Date 生成規則的日期序列
- R invisible 將打印模式更改為不可見
- R noquote “無引號”字符串打印類
- R warning 警告信息
- R rapply 遞歸地將函數應用於列表
- R basename 操作文件路徑
- R with 評估數據環境中的表達式
- R formals 訪問和操縱形式參數
- R icuSetCollate 按 ICU 設置整理
- R search 給出 R 對象的搜索路徑
- R Defunct 將對象標記為已失效
- R gzcon 通過連接(解)壓縮 I/O
- R readRenviron 從文件設置環境變量
- R Sys.localeconv 查找當前語言環境中數字和貨幣表示形式的詳細信息
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Class Methods。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。