存储在对象中时保留函数名称

时间:2014-09-02 10:22:25

标签: r

我正准备一个包,用户必须在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)

现在假设我想在parameters的输出中打印myfunction中存储的函数的名称。

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)。

因此我的问题是

当函数存储在另一个对象中时,是否有人能想到保留函数名的方法?

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:4)

我建议使用函数名称而不是函数本身定义parameters参数,并在myfunctionmatch.fun的正文中检索函数:

    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)
    }

答案 1 :(得分: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