如何复制一个外部包并覆盖一个函数?

How to copy a foreign package and overwrite a function?

我喜欢构建符合 CRAN 的包,但必须覆盖来自外部包的函数。可能我必须在不同的命名空间下复制整个包函数?有没有办法以 CRAN 的方式做到这一点?

本地以下工作,但当然不适用于有效的 CRAN 包

library(xyz)

f1 <- xyz:::f    
body(f1) <- parse(text = gsub("df < 0", "any(df < 0)", deparse(body(f1))))

assignInNamespace("f", f1, ns="xyz")

我非常感谢一个例子。 (xyz 的维护者不可能更改它,因为我的担心是一个非常特殊的情况。)

谢谢 克里斯托夫

我的感觉是你在这里至少有两个可能的选择。这首先是我认为您需要的,但为了完整起见,我将两者都包括在内。

  1. 创建您自己的包并扩展基础包
  2. 创建您自己的扩展基础包功能的功能

nb:如果您可以提供您希望扩展的包和功能,那将非常有帮助,因为我必须使它稍微通用一些。我参考了在这种情况下对我有帮助的原始 Whosebug 帖子。就 further/deeper 阅读而言,我的建议是阅读:

  • R Inferno 作者:帕特里克·伯恩斯
    • 涵盖了 R 的细微差别
    • 阅读第 7 节 - Circle 7 绊倒对象方向
  • R Packages 作者:哈德利·韦翰
    • 第 8 章命名空间
    • Hadley 在解释 R 名称空间方面做得很好。

解决方案选项:

创建您自己的包并扩展基础包

在这种情况下,我的意思是指导您查看编写 R 扩展手册的 1.5.6 部分。

为什么?好吧,根据你的描述,我的感觉是从包中导入函数,然后编写你的扩展函数。

您可以通过使用指令

显式导入 类 和方法来做到这一点
importClassesFrom(package, ...)
importMethodsFrom(package, ...)

分别列出类和函数及其方法。假设我们有两个小包 A 和 B,B 使用 A。那么它们可以有 NAMESPACE 文件

export(f1, ng1)
exportMethods("[")
exportClasses(c1)

importFrom(A, ng1)
importClassesFrom(A, c1)
importMethodsFrom(A, f1)
export(f4, f5)
exportMethods(f6, "[")
exportClasses(c1, c2)

分别

请注意,importMethodsFrom 还将导入在这些方法的命名空间中定义的任何泛型。如果您导出 S4 方法,那么相应的泛型可用是很重要的。例如,您可能需要从图形中导入绘图以使要转换为其隐式泛型的函数可见。但更好的做法是使用 stats4 导出的泛型,因为这可以让多个包明确地在这些泛型上设置方法。

这是之前帮助过我的 Whosebug 问答:

  • 参考:

创建您自己的扩展基础包功能的功能

参见:Overwrite method to extend it, using the original implementation

希望以上内容对您有所帮助。