更改包的内部功能

时间:2012-08-29 13:14:02

标签: r packages

一些背景知识:

我必须经常使用包HMR中的函数HMR。不幸的是,这个功能非常慢。 (HMR本质上是一个拟合函数,它被设计为尽可能健壮,这是缺乏效率的一个原因。)函数HMR调用函数HMR::.HMR.fit1,它执行实际拟合。 使用Rprof我知道关于效率的主要问题是lsfit的使用,它被大量调用。因此,我修改了.HMR.fit1的代码,直接调用lsfit使用的C函数,而没有lsfit的所有开销,这将导致显着的速度增益。

现在我想用HMR::.HMR.fit1替换我的修改后的函数并测试HMR是否会得到相同的结果以及我获得多少速度。

我试着这样做:

mod.fun <- function(<many args>) {
 <a lot of code>
}
environment(mod.fun) <- environment(.HMR.fit1)
.HMR.fit1 <- mod.fun 

但是,HMR::.HMR.fit1不会因此而改变,显然HMR::HMR不使用我修改的拟合函数。有没有办法实现我想要的,而无需从源代码构建软件包,由于我的(Windows)计算机上的用户权限限制,我无法做到这一点?

现在,我的解决方案是复制HMR::HMR的代码,但我希望有一个更方便的解决方案。

2 个答案:

答案 0 :(得分:15)

尝试

?assignInNamespace

.HMR.fit1包中的HMR替换为您的版本。

可能重复:

How do I override a non-visible function in the package namespace?

答案 1 :(得分:8)

对于快速测试,您可以使用trace函数和edit=TRUE来修改函数,这将在适当的命名空间中进行替换,并允许您使用untrace还原功能回到原来的。这些变化不会超出当前会话。