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


R getMethod 獲取或測試方法的定義


R語言 getMethod 位於 methods 包(package)。

說明

如果參數具有 signature 指定的類,則函數 selectMethod() 返回將選擇用於調用函數 f 的方法。找不到方法是一個錯誤,除非參數 optional = TRUE ,在這種情況下返回 NULL

函數 findMethod() 返回包含指定函數和簽名的方法的環境列表;默認情況下,這些是當前搜索列表中包的子集。有關詳細信息,請參閱“使用findMethod()”部分。

函數 getMethod() 返回與提供的函數和簽名相對應的方法,類似於 selectMethod ,但不使用繼承或組泛型。

函數 hasMethod()existsMethod() 分別測試 selectMethod()getMethod() 是否找到匹配的方法。

用法

  selectMethod(f, signature, optional = FALSE, useInherited =,
             mlist = , fdef = , verbose = , doCache = )

  findMethod(f, signature, where)

  getMethod(f, signature = character(), where, optional = FALSE,
             mlist, fdef)

  existsMethod(f, signature = character(), where)

  hasMethod(f, signature = character(), where)

參數

f

通用函數或函數的字符串名稱。

signature

f 的參數匹配的類的簽名。請參閱下麵的詳細信息。

where

尋找方法的環境。默認情況下,如果調用來自命令行,則使用通用函數本身中定義的方法表,findMethod 除外(請參閱下麵的部分)。

optional

如果 selectMethod 中的選擇未找到有效方法,則會生成錯誤,除非 optionalTRUE ,在這種情況下,返回的值為 NULL

mlist, fdef, useInherited, verbose, doCache

getMethodselectMethod 的可選參數供內部使用。避免這些:有些會按預期工作,有些則不會,並且它們都不是正常使用函數所必需的。但有關非標準繼承,請參閱“as() 的方法”部分。

細節

signature 參數指定類,對應於泛型函數的形式參數;準確地說,是通用函數對象的signature槽。參數可以是標識類的字符串向量,並且可以命名或不命名。名稱(如果提供)與泛型簽名中包含的正式參數的名稱相匹配。該簽名通常是除 ... 之外的所有參數。但是,可以僅使用允許的參數子集或使用以不同順序獲取參數的簽名來指定通用函數。

如果您正在處理對其簽名執行特殊操作的泛型,最好在簽名中命名參數以避免混淆。在任何情況下,簽名的元素都會按照函數調用中匹配參數所使用的相同規則與正式簽名進行匹配(請參閱 match.call )。

簽名中的字符串可以是類名、 "missing""ANY" 。請參閱Methods_Details 了解這些在方法選擇中的含義。簽名中未提供的參數隱式對應於類 "ANY" ;特別是,給出一個空簽名意味著尋找默認方法。

getMethod 的調用返回特定函數和簽名的方法。方法的搜索不使用繼承。

函數selectMethod也根據函數和簽名查找方法,但充分利用了方法分派機製;即,繼承的方法和組泛型被考慮在內,就像它們在為相應的簽名分派方法時一樣,但有一個例外,即不使用條件繼承。與 getMethod 類似,selectMethod 返回 NULL 或在未找到該方法時生成錯誤,具體取決於參數 optional

selectMethodgetMethod 通常都會在 R 會話中使用當前版本的通用函數,該函數有一個從會話中加載的所有包中獲取的方法表。可選參數可以導致從指定環境搜索通用函數,但這很少是一個有用的想法。相反,findMethod 具有不同的默認值,並且可能需要可選的where= 參數。請參閱“使用findMethod()”部分。

函數existsMethodhasMethod根據是否找到方法返回TRUEFALSE,第一個對應於getMethod(無繼承),第二個對應於selectMethod

selectMethodgetMethod 的調用將返回選定的方法(如果找到)。 (此類擴展了 function ,因此如果您想要的話,您可以直接將結果用作函數。)否則,如果 optionalFALSE ,則會拋出錯誤,如果 optional 是,則返回 NULL TRUE

返回的方法對象是 MethodDefinition 對象,但基元函數的默認方法必須是基元本身。因此請注意,搜索失敗的唯一可靠測試是 is.null()

findMethod的返回值是找到相應方法的環境列表;即,包含指定方法的方法表。

使用findMethod()

顧名思義,此函數的行為類似於 find ,它在當前搜索列表中生成具有並已導出指定對象的包列表。默認情況下,findMethod 也是這樣做的。在這種情況下,“exported” 部分意味著包的命名空間具有用於此通用函數的 exportMethods 指令。

一個重要的區別是,缺少這樣的指令並不會阻止在加載包後調用包中的方法。否則,包中的代碼無法使用un-exported方法。

因此,如果您的問題是加載包 thisPkg 是否會為此函數和簽名定義方法,則需要詢問有關包的命名空間的問題:

findMethod(f, signature, where = asNamespace("thisPkg"))

如果包未導出該方法,則附加該方法並調用不帶 where 參數的 findMethod 將找不到該方法。

另請注意,簽名的長度必須是相應包使用的長度。如果 thisPkg 隻有一個參數的方法,則隻有長度為 1 的簽名會匹配(沒有尾隨 "ANY" ),即使當前加載的另一個包具有帶有更多參數的簽名。

as() 的方法

函數 setAs 允許包定義將一類對象強製到另一類的方法。這是通過為通用函數 coerce(from, to) 定義方法在內部工作的,該函數不能直接調用。

R評估器使用不同形式的繼承來選擇用於此目的的方法。雖然可以為被強製的對象繼承方法,但不能為目標類繼承方法,因為結果不是該類的有效對象。如果您想檢查選擇過程,則必須提供可選參數useInherited = c(TRUE, FALSE)selectMethod.

例子

testFun <-  function(x)x
setGeneric("testFun")
setMethod("testFun", "numeric", function(x)x+1)

hasMethod("testFun", "numeric") # TRUE

hasMethod("testFun", "integer") #TRUE, inherited

existsMethod("testFun", "integer") #FALSE

hasMethod("testFun") # TRUE, default method

hasMethod("testFun", "ANY")


參考

Chambers, John M. (2016) Extending R, Chapman & Hall. (Chapters 9 and 10.)

Chambers, John M. (2008) Software for Data Analysis: Programming with R Springer. (Section 10.6 for some details of method selection.)

也可以看看

Methods_Details為方法選擇的詳細信息; GenericFunctions 用於其他函數操作方法和通用函數對象; MethodDefinition 用於表示方法定義的類。

相關用法


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