如何不覆盖泛型方法

Ste*_*ien 5 oop methods r s4 r-s3

我试图了解 R 中的 s3 类系统。

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

假设我想foo为 class创建一个方法XYZ

有了 R 的所有包,我怎么能确定我没有覆盖以前创建的泛型方法?

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

ham*_*ust 0

我遇到过类似的问题,我想在这里发布部分解决方案以及在此过程中吸取的一些经验教训。

  • 我不确定问题是否真的是 S3 方法覆盖了通用方法,而是非 s3 方法(我已经发现了一些问题,在和中调度summarys4 方法时失败)lavaansemTool包时失败的问题)。
  • 我们可以通过以下方式检查可用方法methods("foo")或该类的所有方法methods(class="XYZ")
  • 我们可以检查泛型是否已被 注册 isGeneric("foo")

如果方法尚未注册,那么我们需要设置一个通用的 using (不是 的情况summary):

foo<- function(x) UseMethod("foo")
Run Code Online (Sandbox Code Playgroud)

第一个问题是:

  1. 我们只能看到加载包的方法;
  • 可以选择,getS3method(f="foo",class="XYZ")但它需要函数和类;

  • utils::getAnywere("foo")更广泛,但也仅适用于加载的包......

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


第二个问题是:

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

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

(ii) 识别对象类别;

(iii) 检查其文档中是否有任何类型的相应方法(显然,某些 s4 方法在文档中不容易识别,无法在 s3 方法中轻松调用)

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

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

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

但是,尽管考虑类对象结构重新指定方法的替代方案对于summary方法来说稍微容易一些,但对于其他函数来说可能会包含非常艰苦的工作......

我想应该有一个广泛的解决方案来自动考虑 s4 方法,但我对 S4 方法的有限知识目前无法在其中发展......