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

时间:2012-01-05 13:33:02

标签: r function namespaces

我基本上想要更改包的不可见功能。对于可见函数,即在调用methods时没有星号的函数,我发现有两个帖子可以实现我的目标:

  1. 使用assignInNamespace:请参阅R-help上的帖子。
  2. 使用fix:请参阅stackoverflow
  3. 上的帖子

    虽然这两种方法都适用于导出/可见功能(我使用predict.lm作为第二种方法的下面的示例,并使用函数subset.data.frame测试了第一种方法),但它们不起作用不可见的功能,例如predict.ar。这是为什么?有解决方法吗?

    这是一个最小的例子:

    显示predict.lm可见,predict.ar不是:

    methods(predict)
     [1] predict.Arima*             predict.HoltWinters*       predict.StructTS*         
     [4] predict.ar*                predict.arima0*            predict.glm               
     [7] predict.lm                 predict.loess*             predict.mlm               
    [10] predict.nls*               predict.poly               predict.ppr*              
    [13] predict.prcomp*            predict.princomp*          predict.smooth.spline*    
    [16] predict.smooth.spline.fit*
    

    申请predict.lm

    x <- rnorm(5)
    y <- x + rnorm(5)
    predict(lm(y ~ x))
    #          1          2          3          4          5 
    #  1.0783047  1.5288031  0.3268405  0.8373520 -0.9833746
    

    输入cat更改predict.lm(“第一行已更改为predict.lm \ n”) 在函数体的开头。 (您必须在编辑器中手动执行此操作):

    fix(predict.lm)
    predict(lm(y ~ x))
    # First line changed for predict.lm
    #          1          2          3          4          5 
    #  1.0783047  1.5288031  0.3268405  0.8373520 -0.983374
    

    申请predict.ar

    sunspot.ar <- ar(sunspot.year)
    predict(sunspot.ar, n.ahead=25)
    # $pred
    # Time Series:
    # Start = 1989 
    # End = 2013 
    

    尝试更改predict.ar

    fix(predict.ar) #Here, an empty function body appears for me
    fix("stats:::predict.ar") #Here as well
    fix(stats:::predict.ar)
    #Error in fix(stats:::predict.ar) : 'fix' requires a name
    

    尝试使用assignInNamespace代替。 (注意,我刚刚在编辑器中复制了函数stats:::predict.ar并在正文的开头添加了行cat("First line changed for predict.ar\n")。因为函数体很长,所以我只显示前几行)

    mypredict <- function (object, newdata, n.ahead = 1, se.fit = TRUE, ...) 
    {
        cat("First line changed for predict.ar\n")
        if (n.ahead < 1) 
            stop("'n.ahead' must be at least 1")
        #Rest of body of stats:::predict.ar
    }
    assignInNamespace("predict.ar", mypredict, ns="stats")
    predict(sunspot.ar, n.ahead=25)
    # First line changed for predict.ar
    # Error in predict.ar(sunspot.ar, n.ahead = 25) : 
    #   object 'C_artoma' not found
    

    由于“第一行更改为predict.ar”实际上已打印到控制台,因此必须更改predict.ar。但是,为什么找不到对象'C_artoma'?

    更新:好的,这是非常尴尬的,但我不能再删除该帖子了:答案已经在我最后提供的Richie Cotton答案的链接中。抱歉浪费你的时间!我想我检查了一切然后我没有看到明显的。有人可以发布这个答案,我接受它。对不起。

    fixInNamespace(predict.ar, pos="package:stats")
    

1 个答案:

答案 0 :(得分:23)

使用fixInNamespace。 :)

fixInNamespace("predict.ar", "stats")

fixInNamespace("predict.ar", pos="package:stats")

(几年后......)
从Nicholas H的评论:如果你想将一些代码推送到依赖于另一个包的内部函数的CRAN,它将抛出一个构建警告并被R-core拒绝。如果你想要这个内部函数,你应该使用:::运算符复制它并自己维护它。

predict.ar <- stats:::predict.ar