【问题标题】:How to copy a foreign package and overwrite a function?如何复制一个外部包并覆盖一个函数?
【发布时间】:2018-01-03 08:43:53
【问题描述】:

我喜欢构建一个符合 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的维护者不可能改变它,因为我关心的是一个非常特殊的情况。)

谢谢 克里斯托夫

【问题讨论】:

  • 为什么要覆盖foreign 中的内容?这样做通常不是一个好主意,因为它在编写代码时会造成混乱。 R 处理范围的方式意味着最后加载的包会定义函数,因此很难知道正在调用哪个包的函数。
  • 是的,它很脏,但不幸的是,在这种情况下,我看不到其他可能性。是否不可能使其符合 CRAN 标准?
  • 请提供有关您实际尝试执行的操作的更多详细信息。您必须这样做并没有任何明显的理由。
  • 函数是否需要在 xyz 的命名空间中?它是否使用了许多未导出的函数?通常,您只需在自己的命名空间中重新定义函数(同时遵循许可证)。

标签: r package overwrite cran


【解决方案1】:

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

  1. 创建您自己的包并扩展基础包
  2. 创建您自己的函数来扩展基本包函数

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

  • R Inferno 作者:帕特里克·伯恩斯
    • 涵盖了 R 的细微差别
    • 阅读第 7 节 - 第 7 圈在对象方向上的绊脚石
  • R Packages 作者:Hadley Wickham
    • 第 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 导出的泛型,因为这使得多个包可以明确地在这些泛型上设置方法。

这是以前帮助过我的 StackOverflow 问题和答案:

创建您自己的扩展基本包函数的函数

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

我希望以上内容有所帮助。

【讨论】:

    猜你喜欢
    • 2014-09-08
    • 2012-11-15
    • 2014-03-22
    • 1970-01-01
    • 2021-07-12
    • 2021-09-12
    • 1970-01-01
    • 2017-06-25
    • 2018-08-03
    相关资源
    最近更新 更多