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


R implicitGeneric 管理通用函數的隱式版本


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

說明

隱式通用機製將函數的通用版本存儲在包的表中。然而,該包不希望該函數的當前版本成為通用版本,並保留非通用版本。

當調用 setMethodsetGeneric 為這些函數之一創建通用版本時,將使用表中的對象。僅當使用特殊參數來創建泛型時才需要此機製;例如,signaturevalueClass 選項。

函數 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.)

也可以看看

setGeneric

相關用法


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