当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。