改变一个包的内部函数

17

一些背景信息:

我必须经常使用来自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 也没有使用我修改后的拟合函数。有没有办法在不构建软件包的情况下实现我的要求?由于用户权限限制,我无法在计算机上进行构建软件包。

目前,我的解决方法是复制 HMR::HMR 的代码,但我希望有更方便的解决方法。

2个回答

20

如果您想添加新功能而不是修改旧功能,请使用此解决方案:https://dev59.com/BHA75IYBdhLWcg3w0cjx#3402159 - Tomas

8

为了快速测试,您可以使用trace函数和edit=TRUE来修改函数,这将在适当的命名空间中进行替换,并允许您使用untrace将函数恢复到原始状态。这些更改不会持续到当前会话之外。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接