R s3如何不覆盖泛型方法

时间:2014-07-01 05:25:45

标签: r oop

我正试图在R中使用s3类系统。

文档说我需要为我想要创建的方法创建一个通用函数。

假设我想为类 XYZ 创建方法 foo

使用R所有的软件包,我怎样才能确定我没有覆盖以前创建的通用方法?

摘要是一个不好的例子,因为每个人都可能知道它已经存在,但是我的泛型已经有可能已经在我已经加载的包或者我将加载的包中定义了。

1 个答案:

答案 0 :(得分:0)

我遇到过类似的问题,我想在此发布部分解决方案,并从中吸取一些教训。

  • 我不确定该问题是否真的是覆盖通用方法的S3方法,但是非s3方法(我发现了一些问题,这些问题在summary中分发lavaan s4方法时失败,并且semTool包)。
  • 我们可以通过methods("foo")或所有方法来检查可用的方法 methods(class="XYZ")上课。
  • 我们可以检查仿制药是否已经由 isGeneric("foo")

如果方法尚未注册,那么我们需要设置一个泛型使用(summary并非如此):

foo<- function(x) UseMethod("foo")

第一个问题是:

  1. 我们能够看到仅用于已加载软件包的方法;
  • getS3method(f="foo",class="XYZ")选项,但同时需要函数和类;

  • utils::getAnywere("foo")范围更广,而且仅适用于已加载的软件包...

如果仅存在S3方法(不存在S4方法),并且我们没有指定泛型,而是新方法,并且可以确定类名尚未使用,则这并不是真正的问题。


第二个问题是:

  1. 如果该函数还具有关联的S4方法,则显然可以通过指定新的s3方法(即使使用summary的情况下已经具有一个已经存在的泛型)将其发送给S4方法。
  • 目前,我唯一看到的解决方案是为每个已识别的s4方法创建一个新的s3方法...

(i)因此,我们还可以在加载后专门跟踪S3方法.S3methods("foo")或特定类.S3methods(class="XYZ")的s3方法,并在加载后专门找出S4方法(例如,使用.S4methods("foo"))我担心的所有主要包裹...;

(ii)标识对象类别;

(iii)检查其文档中是否存在任何相应的方法(显然,某些s4方法在文档中不太容易识别,因此很容易在s3方法内部调用)

(iv)如果(iii)不可用,请评估其结构;和

(v)通过调用已识别的方法(如果可用)或从对象中提取所需的输出(考虑其结构)来为特定类指定相应的s3方法。

(使用.default是替代方法,但我认为需要仔细考虑)。

但是尽管对于summary方法而言,考虑类对象结构来重新指定方法的方法有些容易,但是对于其他功能而言,这可能是一项艰巨的工作...

我想应该有一个广泛的解决方案来自动考虑s4方法,但是我对S4方法的有限了解暂时无法在其中发展……