在R中安全地创建S3通用函数

34

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>

请参阅“methods”包中的?isGeneric - IRTFM
1
@DWin 这是 S4,不是 S3。 - Joris Meys
也许有一个更通用的解决方案,因为我相信一些基本方法在内部分派而不明显地使用UseMethod。或许:isGenericS3 = function(FUN) body(match.fun(FUN))[[1]] == 'UseMethod' - Charles
@Charles 我的想法也是这样。问题在于,如果你想使用它来确定是否必须在你的软件包内创建S3通用函数,则会出现问题... - Joris Meys
有趣的问题。如果你最终需要拼凑一些东西,.knownS3Generics可能会有用。它知道基本组泛型函数(例如 MathOps),这些函数的主体不包括 'UseMethod' - Josh O'Brien
显示剩余4条评论
1个回答

1
您可以使用 R.methodsS3 包的 isGenericS3 函数。请参见以下代码:
library(R.methodsS3)
isGenericS3(anova)
# [1] TRUE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接