如何从 R
导入 S3 方法当该方法的通用功能未在该包中定义时,不依赖于该包的包?
更具体地说,我的 btergm
包(在 CRAN 和 GitHub 上)从 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/