r - 从未定义泛型函数的包中导入 S3 方法

标签 r namespaces package

如何从 R 导入 S3 方法当该方法的通用功能未在该包中定义时,不依赖于该包的包?

更具体地说,我的 btergm包(在 CRANGitHub 上)从 ergm 导入几个函数包裹。它还使用 formula ergm 的方法(在 simulate 中定义)通用函数(在 methods 包中定义)。我想从 ergm 导入这个方法.我怎么做?

我在别处读到过,我可以向 ergm 添加一个依赖项。包裹。但我不想动ergm来自 Imports:Depends:在描述中因为 btergm包定义了自己的 gof函数,而具有该名称的函数也存在于 ergm 中包裹。这会导致警告我的包覆盖了 gof加载后的功能ergm , 并且 CRAN 不喜欢警告。

它目前在没有导入的情况下工作。然而,lme4包还定义了一个 formula simulate 的方法通用功能。如果有人加载 lme4加载后ergm ,我的代码选择了错误的方法。因此需要适当的导入。
btergm 的描述文件中的当前设置包裹:

Imports: stats4, utils, methods, graphics, network (>= 1.13.0), sna (>= 2.3.2), ergm (>= 3.10.0), parallel, Matrix (>= 1.2.2), boot (>= 1.3.17), coda (>= 0.18.1), stats, ROCR (>= 1.0.7), speedglm (>= 0.3.1), igraph (>= 0.7.1), RSiena (>= 1.0.12.232), statnet.common (>= 4.2.0)
Suggests: 
    fastglm (>= 0.0.1),
    testthat
Depends: R (>= 3.5), xergm.common (>= 1.7.7), ggplot2 (>= 2.0.0)

以及命名空间文件中的相关部分:
import("methods")
...
importFrom("ergm", "ergmMPLE")
importFrom("ergm", "control.simulate.formula")
importFrom("ergm", "remove.offset.formula")
importFrom("ergm", "ergm.getnetwork")
importFrom("ergm", "ergm.getmodel")
importFrom("ergm", "ergm.Cprepare")
importFrom("ergm", "ergm.design")
importFrom("ergm", "ergm.pl")
importFrom("ergm", "control.ergm")
importFrom("ergm", "ergm.getglobalstats")
importFrom("ergm", "ergm.geodistdist")
importFrom("ergm", "ergm")
importFrom("ergm", "mcmc.diagnostics")

ergm包,命名空间导出如下所示:
S3method(simulate,formula)

我现在如何导入?是吗importFrom("ergm", "simulate")importFrom("ergm", "simulate.formula")importFrom("ergm", "formula-method")或者完全不同的东西? Writing R Extensions关于指定进口的部分没有说明这一点。

最佳答案

simulate泛型实际上是在 stats 中定义的,不是 methods .如果你想确保simulate.formula方法来自 ergm找到后,您需要确保ergm包已加载;您从该包中导入的其他内容将确保这一点。

但是,如果 lme4稍后加载,那么它的 simulate.formula方法将优先,您会收到类似的消息

> library(lme4)
Loading required package: Matrix
Registered S3 method overwritten by 'lme4':
  method           from
  simulate.formula ergm

lme4首先加载,你可能会在 ergm 时收到警告覆盖其 simulate.formula方法,可能还有 lme4 中的内容会打破。

没有很多办法可以防止这种情况发生:这是 S3 系统的一个弱点。

理想的解决方案是为 stats 的维护者准备的(R 核心), ergm (Pavel N. Krivitsky) 和 lme4 (Ben Bolker) 聚在一起决定什么simulate.formula应该做,可能把它放在 stats ,然后其他包中的一个或两个将重命名它们的方法。这不太可能很快。

另一种可能是让你得到ergm的维护者。导出方法,所以你可以调用 ergm::simulate.formula明确地。

对于解决方法,您可以使用定义自己的函数
simulate.formula <- ergm:::simulate.formula

并且不导出它。因为它看起来像是在你自己的命名空间中定义的一个方法,我认为它会优先于注册的方法,你的代码应该可以工作。但是,您将收到有关使用 ::: 的检查警告。 ;您可以通过在提交消息中解释对它的需求来解决这个问题。

关于r - 从未定义泛型函数的包中导入 S3 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56653732/

相关文章:

r - 具有显式默认命名空间的 XML 文档的 XPath 和命名空间规范

java - 如何在Java中保存R统计测试的结果

python - 对 Python 子子包感到困惑

php - 在命名空间中找不到类

r - 如何防止从 NAMESPACE 文件中自动删除 importFrom 语句?

java - 外部包无法访问类构造函数

r - ggplot2条形图按一组值排序

r - 仅当查询返回少于 n_max 行时收集

注册 R6 类的 S4 等效项,同时保留继承

javascript - 具有命名空间的意外标识符