2014-09-02 60 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

相关问题