【发布时间】:2011-09-09 10:20:02
【问题描述】:
由于 R 中的 termplot 函数包含一些奇怪的代码,这些代码会给我带来烦人的错误,我想在我自己的测试代码中覆盖它,直到找到更持久的解决方案。问题是 mgcv 包没有加载更改的函数。 mgcv 包使用 NAMESPACE 文件中的 importFrom() 从其命名空间中的 stats 包加载 termplot。
如何说服 mgcv 使用更改后的术语图?我试过了:
unlockBinding("termplot", as.environment("package:stats"))
assign("termplot", my.termplot, as.environment("package:stats"))
lockBinding("termplot", as.environment("package:stats"))
当应用于 lm-objects 时,这有效并且使用了更改后的术语图。但是当使用由 mgcv 包制作的 gam-objects 时,这是行不通的。如果可以避免的话,我真的不会从源代码构建 stats 包...
为了澄清,我也尝试过
assignInNamespace("termplot", my.termplot, ns="stats")
assignInNamespace("termplot", my.termplot, ns="mgcv")
在所有可能的组合中,在附加 mgcv 之前,在附加 mgcv 之后,我没有设法让它工作。
编辑:
我尝试了这里给出的所有选项(除了重建任何一个包),但无法让它工作。对我来说最简单的方法是使用包装函数。可以在here 找到该讨论。感谢所有提示。
一个可重现的例子:
my.termplot <- function (x) print("my new termplot")
unlockBinding("termplot", as.environment("package:stats"))
assignInNamespace("termplot", my.termplot, ns="stats", envir=as.environment("package:stats"))
assign("termplot", my.termplot, as.environment("package:stats"))
lockBinding("termplot", as.environment("package:stats"))
y <- 1:10
x <- 1:10
xx <- lm(y~x)
termplot(xx)
require(mgcv)
dat <- gamSim(1, n = 400, dist = "normal", scale = 2)
b <- gam(y ~ s(x0) + s(x1) + s(x2) + x3, data = dat)
plot(b,all=TRUE)
plot.gam 为非平滑项(在本例中为 x3)调用 termplot,但找不到新的 termplot 函数。
EDIT2:显然,我的示例有效。我现在看到我解决了自己的问题:在第一个代码中,我没有在 assignInNamespace 中添加命名空间和包。重要的是要记住在加载另一个包之前更改命名空间和包中的函数。感谢@hadley 为我指明了正确的方向,@Marek 用于测试代码并报告它的工作原理,其余的则用于努力回答。
【问题讨论】:
-
您在加载统计信息之前尝试使用
assignInNamespace吗?例如。在.Rprofile中??assignInNamespace中有注释:“assignInNamespace更改命名空间中的副本,但没有任何已从命名空间导出的副本” -
@Joris:请举例说明您如何调用
termplot。显而易见的答案是打电话给my.termplot或你覆盖的stats::termplot,但我想这对你来说是不可能的。 -
@Richie @Joris 并没有真正调用
termplot(),mgcv 正在调用termplot(),而 Joris 想要一种方法让 mgcv 看到他分配给 stats 命名空间的新版本 termplot ,但无法让 mgcv 看到除原件之外的任何内容。 -
@Marek :会尝试。我确实检查过;
termplot和stats:termplot都返回正确的函数。这就是我使用整个 unlockBinding... 的原因。但不知何故,mgcv 在其他地方得到了它。谢谢你的小费 -
这将很难,因为您需要覆盖 S3 方法表中的函数。
标签: function r namespaces package