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


R UseMethod 類方法


R語言 UseMethod 位於 base 包(package)。

說明

R擁有簡單的通用函數機製,可用於麵向對象的編程風格。方法調度基於泛型函數的第一個參數的類或作為參數提供的對象的類進行UseMethod或者NextMethod.

用法

UseMethod(generic, object)

NextMethod(generic = NULL, object = NULL, ...)

參數

generic

命名函數的字符串(而不是內置運算符)。 UseMethod 必需。

object

對於 UseMethod :一個對象,其類將確定要分派的方法。默認為封閉函數的第一個參數。

...

要傳遞給下一個方法的更多參數。

細節

一個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 genericgroup generic函數。 UseMethod 當前即使對於不是對象的參數也會在隱式類上分派,但其他分派方式則不會。

NextMethod 調用下一個方法(由類向量確定,或者是提供給泛型的對象,或者是包含 NextMethod 的函數的第一個參數(如果直接調用方法)。通常 NextMethod 僅與一個參數一起使用, generic ,但如果提供更多參數,這些參數將修改對下一個方法的調用。

NextMethod 不應被調用,除非在 UseMethod 或內部泛型調用的方法中(請參閱 InternalGenerics )。特別是它不能在匿名調用函數中工作(例如 get("print.ts")(AirPassengers) )。

命名空間可以注冊通用函數的方法。為了支持這一點,UseMethodNextMethod在兩個地方搜索方法:在調用泛型函數的環境中,以及在定義泛型的環境(通常是命名空間)的注冊數據庫中。因此,泛型函數的方法需要在泛型調用的環境中可用,或者必須注冊它們。 (它們在定義泛型的環境中是否可見並不重要。)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 。這些是在調度機製評估方法的環境中設置的,如下所示:

  1. 找到調用函數(通用函數)的上下文:這為我們提供了原始調用的未計算參數。

  2. 評估用於調度的對象(通常是參數),並找到一個方法(可能是默認方法)或拋出錯誤。

  3. 創建一個用於評估該方法的環境,並將特殊變量(見下文)插入該環境中。還要複製泛型環境中非形式(或實際)參數的任何變量。

  4. 將參數列表修複為與方法的形式匹配的調用參數。

.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 語言定義”草案。

methodsclass 包括.class2()getS3methodis.object

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Class Methods。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。