如何在R中子类化一个函数?

时间:2015-01-27 18:32:05

标签: r function reference-class

我想知道是否可以使用引用类来对R中的函数进行子类化。例如,以下

> CustomFunction <- setRefClass("CustomFunction", contains = "function")
> foo <- CustomFunction()
> foo()
NULL

正常工作(不会抛出错误),但如何自定义行为(即返回NULL除外)?如何定义函数参数?

我也试过

> setMethod("(",
>   signature(x = "CustomFunction"),
>   function(...) {
>       "Hello!"    # A function that always returns "Hello!"
>   }
> )
Error in genericForPrimitive(f) : 
  methods may not be defined for primitive function ‘(’ in this version of R

但这似乎不起作用。


我希望能够子类化函数意味着我可以在函数调用之前和之后实现自定义行为。例如。具有在每次调用时自动记录调用表达式的函数(用于审计目的),或创建在返回NULL等时自动抛出错误的函数等。

1 个答案:

答案 0 :(得分:1)

你不需要参考类,你可以只附上感兴趣的函数

logger <- function(f) {
    force(f)
    function(...) {
        print("running function...")
        f(...)
    }
}

printhello <- function(name="Al") print(paste("hello", name))

printhello_logged <- logger(printhello)

printhello()
# [1] "hello Al"
printhello_logged("Zed")
# [1] "running function..."
# [1] "hello Zed"

如果这是出于审核/测试类型的目的,您可能会对trace()感兴趣,它允许您将代码附加到各个功能部分。