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