更改包的内部功能

Rol*_*and 13 packages r

一些背景:

我必须经常使用HMR包中HMR的函数.不幸的是,这个功能非常慢.(HMR本质上是一个拟合函数,它被设计为尽可能健壮,这是缺乏效率的一个原因.)函数HMR调用函数HMR::.HMR.fit1,它执行实际拟合.使用Rprof我知道关于效率的主要问题是使用lsfit,这被称为很多.因此,我修改了代码.HMR.fit1lsfit直接调用直接使用的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 
Run Code Online (Sandbox Code Playgroud)

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

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

Mat*_*wle 16

尝试

?assignInNamespace
Run Code Online (Sandbox Code Playgroud)

更换.HMR.fit1HMR包装与您的版本.

可能重复:

如何覆盖包命名空间中的不可见函数?


Gre*_*now 8

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