2016-12-12 75 views
0

我想在R中編寫一個非常簡單的函數包裝器,它將接受f並返回g,其中g在第一個參數爲負數時返回零。我有以下的代碼如預期R函數包裝比維護函數簽名

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?

回答

1

這是你想要的。你真的需要這個嗎?

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