我试图了解 R 中的 s3 类系统。
文档说我需要为我想要创建的方法创建一个通用函数。
假设我想foo
为 class创建一个方法XYZ
。
有了 R 拥有的所有包,我怎么能确定我没有覆盖以前创建的泛型方法?
摘要是一个不好的例子,因为每个人都可能知道它已经存在,但是我的泛型可能已经定义在我已经加载或我将加载的包中。
我遇到过类似的问题,我想在这里发布一个部分解决方案,并在此过程中吸取一些教训。
summary
s4 方法失败)。lavaan
semTool
methods("foo")
或所有方法methods(class="XYZ")
。isGeneric("foo")
.如果方法还没有注册,那么,我们需要设置一个泛型 using (不是这种情况summary
):
foo<- function(x) UseMethod("foo")
第一个问题是:
可以选择,getS3method(f="foo",class="XYZ")
但它需要函数和类;
utils::getAnywere("foo")
更广泛,但也仅适用于加载的包......
如果只存在 S3 方法(没有 S4 方法),这并不是真正的问题,并且我们没有指定泛型,而只是新方法,并且我们确定尚未使用类名。
第二个问题是:
summary
如果该函数还具有关联的 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 的有限知识目前无法在其中发展......