As the termplot
R 中的函数包含一些奇怪的代码,这些代码给我带来了烦人的错误,我想在我自己的测试代码中覆盖它,直到找到更永久的解决方案。问题是更改的函数没有被加载mgcv
包裹。这mgcv
包从其命名空间中的 stats 包加载 termplot,使用importFrom()
在命名空间文件中。
如何说服 mgcv 使用更改后的 termplot?我试过 :
unlockBinding("termplot", as.environment("package:stats"))
assign("termplot", my.termplot, as.environment("package:stats"))
lockBinding("termplot", as.environment("package:stats"))
当应用于 lm-objects 时,这有效并且使用更改后的 termplot。但是当使用 mgcv 包制作的 gam-objects 时,这不起作用。如果我可以避免的话,我真的不会从源代码构建统计包......
为了澄清,我也尝试过
assignInNamespace("termplot", my.termplot, ns="stats")
assignInNamespace("termplot", my.termplot, ns="mgcv")
在所有可能的组合中,在附加 mgcv 之前,在附加 mgcv 之后,我没有设法让它工作。
EDIT :
我尝试了此处给出的所有选项(除了重建任一包),但无法使其工作。对我来说最简单的方法是使用包装函数。那个讨论可以找到here https://stat.ethz.ch/pipermail/r-devel/2011-June/061197.html。感谢所有的提示。
一个可重现的例子:
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:显然,我的例子有效。我现在看到我解决了我自己的问题:在第一个代码中,我没有在 allocateInNamespace 中添加命名空间和包。重要的是要记住在加载其他包之前更改命名空间和包中的函数。感谢@hadley 为我指明了正确的方向,感谢@Marek 测试了代码并报告其工作原理,其余的感谢您努力回答。