如何复制一个外部包并覆盖一个函数?
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 的维护者不可能更改它,因为我的担心是一个非常特殊的情况。)
谢谢
克里斯托夫
我的感觉是你在这里至少有两个可能的选择。这首先是我认为您需要的,但为了完整起见,我将两者都包括在内。
- 创建您自己的包并扩展基础包
- 创建您自己的扩展基础包功能的功能
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
希望以上内容对您有所帮助。
我喜欢构建符合 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 的维护者不可能更改它,因为我的担心是一个非常特殊的情况。)
谢谢 克里斯托夫
我的感觉是你在这里至少有两个可能的选择。这首先是我认为您需要的,但为了完整起见,我将两者都包括在内。
- 创建您自己的包并扩展基础包
- 创建您自己的扩展基础包功能的功能
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
希望以上内容对您有所帮助。