【发布时间】:2019-01-09 02:37:24
【问题描述】:
我希望达到的目标
所以我想在函数列表中获取函数的名称。
这是一个例子:
foo = list(foo1 = sum, foo2 = mean)
我希望从foo 中提取的是:
list("sum", "mean")
我希望它是一个函数,意思是:
> foo = list(foo1 = sum, foo2 = mean)
> super_function(foo)
list("sum", "mean")
我检查过的内容
申请名称:
> sapply(foo , names)
$`foo1`
NULL
$foo2
NULL
应用 deparse(substitute())
> my_f <- function(x)deparse(substitute(x))
> sapply(foo, my_f)
foo1 foo2
"X[[i]]" "X[[i]]"
这两种想法都行不通....
更多背景:
这里有更多细节。不需要他们理解第一个问题,而是社区询问的额外细节。
我将这些函数用作用户给定的聚合函数。
data(iris)
agg_function<-function(data, fun_to_apply){
res <- list()
for (col_to_transform in names(fun_to_apply)){
res[col_to_transform] <- (fun_to_apply[[col_to_transform]])(data[[col_to_transform]])
}
res
}
agg_function(iris, fun_to_apply = list("Sepal.Length" = mean, "Petal.Length" = sum))
结果是:
$`Sepal.Length`
[1] 5.843333
$Petal.Length
[1] 563.7
在本例中,我对两列 iris 执行聚合。但我希望在我的结果的每个字段的名称中包含执行函数的名称。 注意:这是对我正在做的事情的过度简化;
结论:
你有什么想法吗?
【问题讨论】:
-
我是这么想的。那太容易了!
-
不确定这是否可行。也许
my_f1 <- function(x) {lapply(x, deparse)}可以提供帮助,尽管my_f1(foo)的输出并不完全符合预期。 -
好吧,让我们以
foo = list(sd)为例,函数代码中甚至没有提示这与“sd”有关。唯一限制候选者数量的是字节码(如何将字节码映射到函数名)和命名空间。但是考虑一下您在全局环境中拥有的功能。 -
您能否提供更多关于您如何获取数据(乐趣列表)以及您想用它做什么的背景知识?也许有一种完全不同的方法。
-
您需要以某种方式告诉/强制“用户”以字符串形式输入函数。然后你可以像这样使用它:
get("sum")(1:3)
标签: r