是否可以“包装”R函数来修改其功能?

时间:2013-05-11 02:50:47

标签: r metaprogramming

是否可以包装R函数来修改其功能?

这是一个玩具示例来解释我的意思。考虑这个函数sum2

 sum2 <- function (x) if (length(x) == 1) { cat(x); sum(x) } else sum(x)

它通过微小的修改来完成sum所做的事情。假设我想重新定义 sum本身以执行sum2在此处执行的操作。我怎么能以一般的方式做到这一点,却不知道我正在包装的函数的内部结构?

我想这样做暂时“修复”一个包函数,而不必修改和重新安装包。我想检查它的输入并返回一个特殊值,以防输入满足某些条件。

(对于那些对Mathematica非常熟悉的人,我正在寻找与Gayley-Villegas trick类似的东西。)

2 个答案:

答案 0 :(得分:5)

你需要小心这一点。所有包现在都有Namespaces,并将调用同一名称空间中的其他函数。从主命令提示符调用函数时,您的方法可能会起作用。但是包中的函数将调用原始函数,而不是您的修改。

查看assignInNamespace及相关函数的帮助,了解如何在命名空间中进行更改。 trace函数是另一种修改函数的方法,为现有函数添加了一些额外的代码。

答案 1 :(得分:-1)

这些方面的某些方面有效:

sum2 <- sum
sum <- function (x) if (length(x) == 1) { cat(x); sum2(x) } else sum2(x)

我没有意识到的是,我可以将sum的原始定义存储在sum2中,以便我可以从重新定义的sum中调用它。

正如Matthew所说,当sum被称为base::sum时,这不会覆盖{{1}}。