5

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

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

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

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

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

4

1 回答 1

0

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

  • 我不确定问题是否真的是覆盖通用方法的 S3 方法,而是非 s3 方法(我已经确定了一些问题,即在发送和打包中的summarys4 方法失败)。lavaansemTool
  • 我们可以通过 来检查类的可用方法methods("foo")或所有方法methods(class="XYZ")
  • 我们可以检查一个泛型是否已经被 isGeneric("foo").

如果方法还没有注册,那么,我们需要设置一个泛型 using (不是这种情况summary):

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

第一个问题是:

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

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

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


第二个问题是:

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

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

(ii) 识别对象类别;

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

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

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

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

但是,尽管考虑到类对象结构来重新指定方法的替代方法对于summary方法来说更容易一些,但对于其他功能来说,这可能是一项非常艰巨的工作......

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

于 2020-09-02T15:06:40.653 回答