2014-09-02 22 views
2

我正在準備一個包,其中用戶必須將函數及其關聯參數存儲在list中供以後使用。這是它如何工作的典型的例子:存儲在對象中時保留函數名稱

製備含有功能名稱和參數

parameters <- list(a1 = list(fun = dnorm, 
          args = list(mean = 150, sd = 100)), 
        a2 = list(fun = dpois, 
          args = list(lambda = 40))) 

這裏列表的是如何這個參數對象在其他功能中使用的一個示例:

x <- 1:100 
myfunction <- function(x, var, parameters) 
{ 
    results <- list(var = var, 
        y = do.call(parameters[[var]]$fun, 
           c(list(x), parameters[[var]]$args)), 
        parameters = parameters) 
    class(results) <- "customclass" 
    return(results) 
} 
myfunction(x, "a1", parameters) 

現在假設我想在myfunction的輸出中打印存儲在parameters中的函數的名稱。

print.customclass <- function(X) 
{ 
    cat("Function name:", X$parameters[[X$var]]$fun) 
} 

此自定義打印將無法正常工作:

> myfunction(x, "a1", parameters) 
Error in cat(list(...), file, sep, fill, labels, append) : 
argument 2 (type 'closure') cannot be handled by 'cat' 

我也試圖在其他地方發現了其他建議的解決方案,如:

print.customclass <- function(X) 
{ 
    cat("Function name:", deparse(quote(X$parameters[[X$var]]$fun))) 
} 

> myfunction(x, "a1", parameters) 
Function name: X$parameters[[X$var]]$fun 

Harlan in this other question,該函數的名稱當存儲在另一個R對象中時會丟失。他建議命名的功能與功能名稱列表,例如:

parameters <- list(a1 = list(dnorm = dnorm, 
          args = list(mean = 150, sd = 100)), 
        a2 = list(dpois = dpois, 
          args = list(lambda = 40))) 

不過,我想保持相同的名稱(fun)我list的每一個元素。因此

我的問題是

任何人可以想辦法讓函數名,當函數存儲在另一個對象?

非常感謝您的幫助!

回答

3

你可以使用alist S:

parameters <- list(a1 = alist(fun = dnorm, 
          args = list(mean = 150, sd = 100)), 
        a2 = alist(fun = dpois, 
          args = list(lambda = 40))) 
#probably better to write a constructor method for parameters objects 


x <- 1:100 
myfunction <- function(x, var, parameters) 
{ f <- function(x) do.call(fun, c(list(x), args)) 
    formals(f) <- c(formals(f), parameters[[var]]) 
    results <- list(var = var, 
        y = f(x), 
        parameters = parameters) 
    class(results) <- "customclass" 
    return(results) 
} 

print.customclass <- function(X) 
{ 
    cat("Function name:", X$parameters[[X$var]]$fun) 
} 

myfunction(x, "a1", parameters) 
#Function name: dnorm 
+0

這是一個很好的答案,我不知道'alist'。你是對的,我應該爲參數對象寫一個構造函數方法。我不確定我如何編寫它,使其非常人性化。 – 2014-09-02 11:38:36

+0

@BorisLeroy我已經改變了這個功能,因爲''這樣的評估似乎有點笨重。 – Roland 2014-09-02 12:30:25

4

我建議用函數名定義parameters的說法,而不是本身的功能,並通過match.fun檢索的myfunction體內的功能:

parameters <- list(a1 = list(fun = "dnorm", 
         args = list(mean = 150, sd = 100)), 
       a2 = list(fun = "dpois", 
         args = list(lambda = 40))) 

    myfunction <- function(x, var, parameters) 
    { 
     results <- list(var = var, 
       y = do.call(match.fun(parameters[[var]]$fun), 
          c(list(x), parameters[[var]]$args)), 
       parameters = parameters) 
     class(results) <- "customclass" 
     return(results) 
    } 
+0

這是另一個很好的答案,就像@羅蘭的答案一樣有效。我還沒有決定我會執行哪一個,但對我來說這兩者似乎都非常有效。 – 2014-09-02 11:40:14

相關問題