Henrik Bengtsson提供了一种不必担心先前是否已经创建S3泛型的不错方法在R中创建S3泛型,他在2002年就做到了这一点。
他的setGenericsS3函数实际上是:
- 检查名称是否正确
- 检查是否存在该名称的函数
如果存在,
- 检查它是否是泛型
- 如果不是,将其重命名为.default并创建一个泛型
如果不存在,则只需创建泛型。
这段代码证明了在没有可用的泛型时自动创建泛型非常有用。随着我们迈向新的R时代,我想知道现在在R中实现相同效果的正确方法是什么。我找不到isS3Generic()
或类似的函数,在R 2.14中引入强制使用命名空间之前,Henrik Bengtsson的代码来自很久以前。我记得我看过其他实现相同效果的方法,但无法找到它们。
编辑:我特别寻找S3。函数isGeneric()
仅适用于S4,例如对于anova
(它是S3泛型):
> isGeneric('anova')
[1] FALSE
> anova
function (object, ...)
UseMethod("anova")
<bytecode: 0x04dc7a18>
<environment: namespace:stats>
?isGeneric
。 - IRTFMisGenericS3 = function(FUN) body(match.fun(FUN))[[1]] == 'UseMethod'
。 - Charles.knownS3Generics
可能会有用。它知道基本组泛型函数(例如Math
和Ops
),这些函数的主体不包括'UseMethod'
。 - Josh O'Brien