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

标签 r function namespaces

我基本上想更改包的不可见功能。对于可见函数,即在调用 methods 时没有星号的函数,我发现了两篇文章如何实现我的目标:

  1. 使用assignInNamespace:请参阅 R-help 上的帖子.
  2. 使用修复:请参阅 stackoverflow 上的帖子

尽管这两种方法都适用于导出/可见函数(我使用 predict.lm 作为第二种方法的示例,并使用函数 subset.data 测试了第一种方法。框架),它们不适用于不可见的功能,例如预测.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("First linechanged for Predict.lm\n") 更改 predict.lm 在函数体的开头。 (您必须在编辑器中手动执行此操作):

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 linechanged 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

由于“First linechangedforpredict.ar”实际上被打印到控制台,因此predict.ar一定已被更改。但是,为什么不再找到对象“C_artoma”?

更新:好吧,这太尴尬了,但我不能再删除那个帖子了:答案已经在我最后提供的 Richie Cotton 答案的链接中了。抱歉浪费您的时间!我想我检查了所有内容,然后我没有看到明显的情况。有人可以将此作为答案发布吗,我接受它。再次抱歉。

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

最佳答案

使用fixInNamespace。 :)

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

fixInNamespace("predict.ar", pos="package:stats")
<小时/>

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

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

关于r - 如何覆盖包命名空间中不可见的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8743390/

相关文章:

r - 从 R 中的字符串中提取最后 n 个字符

php - 单击按钮运行 php 函数

r - 如何使用 for 循环将函数应用于数据框中列中的特定值

r - 如何在R中读取vcf文件

r - 在 R Shiny 服务器上保存临时文件

c++ - namespace 检测

php - 命名空间的用途是什么,我是否以正确的方式使用它?

c++ - 了解 C++ 中运算符的范围

r - R 包中 README 和小插图之间的目的区别是什么?

c++ - Char 指针与传递给函数的 Int 指针