一些背景知识:
我必须经常使用包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
的代码,但我希望有一个更方便的解决方案。
答案 0 :(得分:15)
尝试
?assignInNamespace
将.HMR.fit1
包中的HMR
替换为您的版本。
可能重复:
How do I override a non-visible function in the package namespace?
答案 1 :(得分:8)
对于快速测试,您可以使用trace
函数和edit=TRUE
来修改函数,这将在适当的命名空间中进行替换,并允许您使用untrace
还原功能回到原来的。这些变化不会超出当前会话。