gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:54:44 26 4
gpt4 key购买 nike

我正在准备一个包,用户必须在其中将函数及其相关参数存储在 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)))

但是,我想为我的 list 中的每个元素保留相同的名称(fun)。

因此我的问题是

当函数存储在另一个对象中时,有人能想出一种方法来保留函数名称吗?

非常感谢您的帮助!

最佳答案

我建议使用函数名称而不是函数本身来定义您的parameters 参数,并通过match 在myfunction 的主体中检索函数.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)
}

关于r - 存储在对象中时保留函数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25621108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com