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

How to subclass a function in R?

我想知道是否可以使用 Reference 类 对 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 时自动抛出错误的函数等

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

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"

如果这是为了 auditing/testing 类型的目的,您可能会对 trace() 感兴趣,它允许您将代码附加到函数的各个部分。