R函数包装器比维护函数签名

R function wrapper than maintains function signature

我正在尝试在 R 中编写一个非常简单的函数包装器,它将接受 f 和 return g,其中只要第一个参数为负,g returns 为零。我有以下代码

wrapper <- function(f) {
    function(x, ...) {
        if( x <= 0 ) { 0 }
        else { f(x, ...) }
    }
}

Thge 包装器按预期工作,但有没有办法维护函数签名

> wdnorm <- wrapper(dnorm)

> args(dnorm)
function (x, mean = 0, sd = 1, log = FALSE)
NULL

> args(wdnorm)
function (x, ...)
NULL

我想做这样的事情(但显然行不通)

args(g) <- args(f)

这在 R 中可行吗?

这就是你想要的。 To,你真的需要这个吗?

wrapper <- function(f) {
    f2 = function(x) {
        if (x <= 0) { 0 }
        else { do.call(f, as.list( match.call())[-1]) }
    }
    formals(f2) = formals(f)
    f2
}

wdnorm <- wrapper(dnorm)

args(dnorm)
args(wdnorm)

wdnorm(-5)
wdnorm(5)

输出

> args(dnorm)
function (x, mean = 0, sd = 1, log = FALSE) 
NULL
> args(wdnorm)
function (x, mean = 0, sd = 1, log = FALSE) 
NULL

> wdnorm(-5)
[1] 0
> wdnorm(5)
[1] 1.48672e-06