gpt4 book ai didi

r - 如何不覆盖泛型方法

转载 作者:行者123 更新时间:2023-12-03 17:49:28 25 4
gpt4 key购买 nike

我试图了解 R 中的 s3 类系统。
文档说我需要为我想要创建的方法创建一个通用函数。
假设我想创建一个方法 foo 类(class) XYZ .
有了 R 的所有包,我怎么能确定我没有覆盖以前创建的泛型方法?
总结是一个不好的例子,因为每个人都可能知道它已经存在,但是我的泛型可能已经在我已经加载或将要加载的包中定义。

最佳答案

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

  • 我不确定这个问题是否真的是 S3 方法覆盖了通用方法,而是非 s3 方法(我已经确定了一些问题,在发送 summarylavaan 包中的 semTool s4 方法时失败)。
  • 我们可以通过 methods("foo") 查看可用的方法或所有方法
    为类(class) methods(class="XYZ") .
  • 我们可以检查泛型是否已经被注册isGeneric("foo") .

  • 如果这些方法还没有注册,那么我们需要设置一个泛型 using(不是 summary 的情况):
    foo<- function(x) UseMethod("foo")

    第一个问题是:
  • 我们能够看到仅用于加载包的方法;
  • getS3method(f="foo",class="XYZ")的选项但它需要函数和类;
  • utils::getAnywere("foo")更广泛,而且,仅适用于加载的包...

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

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

  • (i) 所以我们也可以专门针对 S3 方法进行跟踪 .S3methods("foo")或特定类的 s3 方法 .S3methods(class="XYZ")并在加载我担心的所有主要包后特别找出 S4 方法(例如使用 .S4methods("foo"))...;
    (ii) 识别对象类别;
    (iii) 检查其文档中是否有任何类型的相应方法(显然某些 s4 方法在文档中不太容易识别以在 s3method 中轻松调用)
    (iv) 如果 (iii) 不可用,则评估其结构;和
    (v) 通过调用已识别的方法(如果可用)或从对象中提取所需的输出,考虑其结构,为特定类指定相应的 s3 方法......
    (使用 .default 是一种替代方法,但我认为需要仔细考虑)。
    但是,尽管对于 summary 来说,考虑类对象结构来重新指定方法的选择要容易一些。方法,对于其他功能可能包括非常艰苦的工作......
    我想应该有一个广泛的解决方案来自动考虑 s4 方法,但是我对 S4methods 的有限知识暂时无法在其中发展......

    关于r - 如何不覆盖泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24502993/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com