implicitGeneric
位於 methods
包(package)。 說明
隱式通用機製將函數的通用版本存儲在包的表中。然而,該包不希望該函數的當前版本成為通用版本,並保留非通用版本。
當調用 setMethod
或 setGeneric
為這些函數之一創建通用版本時,將使用表中的對象。僅當使用特殊參數來創建泛型時才需要此機製;例如,signature
或 valueClass
選項。
函數 implicitGeneric()
返回隱式泛型版本,setGenericImplicit()
轉換隱式泛型,prohibitGeneric()
阻止函數變得泛型,registerImplicitGenerics()
在當前會話的緩存表中保存一組隱式泛型定義。
用法
implicitGeneric(name, where, generic)
setGenericImplicit(name, where, restore = TRUE)
prohibitGeneric(name, where)
registerImplicitGenerics(what, where)
參數
name |
函數的字符串名稱。 |
where |
注冊隱式泛型的包或環境。當使用您自己的包源頂層的函數時,應省略此參數。 |
generic |
已過時,並且可能會被棄用。 |
restore |
是否應該恢複該函數的非通用版本? |
what |
要注冊的隱式泛型的可選表,但當它默認為標準元數據名稱時,幾乎總是被省略。 |
細節
多個包可以為同一函數定義方法,以應用於該包中定義的類。算術和其他運算符、plot()
和許多其他基本計算都是典型示例。所有此類包都必須為通用函數的相同定義編寫方法,這一點至關重要。隻要該泛型使用簽名和其他參數的默認選擇,就無需執行任何操作。
如果泛型具有特殊屬性,則需要為為其創建方法的所有包確保這些屬性。最簡單的解決方案就是使該函數在最初擁有它的包中通用。如果由於某種原因該包的所有者不願意這樣做,替代方法是定義正確的泛型,將其保存在特殊表中並通過調用 setGenericImplicit
恢複非泛型版本。
請注意,包含該函數的包也可以為隱式泛型定義方法;當隱式泛型成為真正的泛型時,這些方法將被包含在內。
擁有非默認隱式泛型的通常原因是提供非默認簽名,而通常的原因是允許對某些參數進行惰性求值。泛型函數簽名中的所有參數都必須在函數需要選擇方法時進行評估。在下麵示例中的基函數 with()
中,必須延遲對參數 expr
的求值;因此,它被排除在簽名之外。
如果您想完全禁止任何人將您的函數變成泛型,請調用 prohibitGeneric()
。
函數 implicitGeneric()
返回指定函數的隱式通用版本。如果沒有這些表或者該函數不在表中,則返回簡單調用 setGeneric(name)
的結果。
值
函數 implicitGeneric()
返回隱式泛型定義(如果必須構造該定義,則首次緩存該定義)。
其他函數的存在是因為它們的副作用,並且不返回任何有用的東西。
基函數的隱式泛型
發行版中提供的包中的某些函數存在隱式通用版本R本身。它們存儲在‘methods’包本身中並且始終可用。
正如文檔中反複強調的那樣, setGeneric()
調用另一個包中的函數不應具有參數的非默認設置,例如 signature
。該推理特別適用於所提供的包中的函數,因為這些方法可能存在於多個包中。調用 implicitGeneric()
將顯示通用版本。
例子
### How we would make the function with() into a generic:
## Since the second argument, 'expr' is used literally, we want
## with() to only have "data" in the signature.
## Not run:
setGeneric("with", signature = "data")
## Now we could predefine methods for "with" if we wanted to.
## When ready, we store the generic as implicit, and restore the
original
setGenericImplicit("with")
## End(Not run)
implicitGeneric("with")
# (This implicit generic is stored in the 'methods' package.)
也可以看看
相關用法
- R is 對象是來自類嗎?
- R isSealedMethod 檢查密封方法或類
- R inheritedSlotNames 從超級類繼承的插槽名稱
- 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 cbind2 按列或行組合兩個對象
- R GenericFunctions 管理通用函數的工具
- R dotsMethods 在方法簽名中使用...
- R S3Part 包含 S3 類的 S4 類
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Manage Implicit Versions of Generic Functions。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。