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 |
與 |
where |
尋找方法的環境。默認情況下,如果調用來自命令行,則使用通用函數本身中定義的方法表, |
optional |
如果 |
mlist, fdef, useInherited, verbose, doCache |
|
細節
signature
參數指定類,對應於泛型函數的形式參數;準確地說,是通用函數對象的signature
槽。參數可以是標識類的字符串向量,並且可以命名或不命名。名稱(如果提供)與泛型簽名中包含的正式參數的名稱相匹配。該簽名通常是除 ... 之外的所有參數。但是,可以僅使用允許的參數子集或使用以不同順序獲取參數的簽名來指定通用函數。
如果您正在處理對其簽名執行特殊操作的泛型,最好在簽名中命名參數以避免混淆。在任何情況下,簽名的元素都會按照函數調用中匹配參數所使用的相同規則與正式簽名進行匹配(請參閱 match.call
)。
簽名中的字符串可以是類名、 "missing"
或 "ANY"
。請參閱Methods_Details 了解這些在方法選擇中的含義。簽名中未提供的參數隱式對應於類 "ANY"
;特別是,給出一個空簽名意味著尋找默認方法。
對 getMethod
的調用返回特定函數和簽名的方法。方法的搜索不使用繼承。
函數selectMethod
也根據函數和簽名查找方法,但充分利用了方法分派機製;即,繼承的方法和組泛型被考慮在內,就像它們在為相應的簽名分派方法時一樣,但有一個例外,即不使用條件繼承。與 getMethod
類似,selectMethod
返回 NULL
或在未找到該方法時生成錯誤,具體取決於參數 optional
。
selectMethod
和 getMethod
通常都會在 R 會話中使用當前版本的通用函數,該函數有一個從會話中加載的所有包中獲取的方法表。可選參數可以導致從指定環境搜索通用函數,但這很少是一個有用的想法。相反,findMethod
具有不同的默認值,並且可能需要可選的where=
參數。請參閱“使用findMethod()
”部分。
函數existsMethod
和hasMethod
根據是否找到方法返回TRUE
或FALSE
,第一個對應於getMethod
(無繼承),第二個對應於selectMethod
。
值
對selectMethod
或getMethod
的調用將返回選定的方法(如果找到)。 (此類擴展了 function
,因此如果您想要的話,您可以直接將結果用作函數。)否則,如果 optional
是 FALSE
,則會拋出錯誤,如果 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 getClass 獲取類定義
- R getPackageName 與給定包關聯的名稱
- 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 slot 正式類對象中的槽
- R S4groupGeneric S4組通用函數
- R methodUtilities 用於方法和 S-Plus 兼容性的實用函數
- R evalSource 使用源文件中的函數定義,無需重新安裝包
- R is 對象是來自類嗎?
- R isSealedMethod 檢查密封方法或類
- R cbind2 按列或行組合兩個對象
- R GenericFunctions 管理通用函數的工具
- R dotsMethods 在方法簽名中使用...
- R S3Part 包含 S3 類的 S4 類
- R nonStructure-class 基本類型的非結構 S4 類
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Get or Test for the Definition of a Method。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。