【问题标题】:Change internal function of a package [duplicate]更改包的内部功能[重复]
【发布时间】:2012-08-24 02:47:21
【问题描述】:

一些背景:

我必须经常使用包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的代码,但希望有更方便的解决方案。

【问题讨论】:

    标签: r packages


    【解决方案1】:

    试试

    ?assignInNamespace
    

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

    可能重复:

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-07-26
      • 2023-03-20
      • 1970-01-01
      • 2011-11-02
      • 2018-06-09
      • 2018-11-11
      • 2015-08-26
      • 1970-01-01
      • 2015-09-07
      相关资源
      最近更新 更多