获取传递到另一个函数的函数向量的字符串名称 [英] Get string names of a vector of functions passed into another function
本文介绍了获取传递到另一个函数的函数向量的字符串名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一系列聚合函数,我希望将它们应用于数据框中的多个列(使用purrr::map
)。有些是标准函数,如mean
,有些是用户定义的函数。
我希望输出是一个数据框,其中这些函数的名称作为存储其输出的列。
下面的示例显示了该过程和所需的输出:
library(purrr)
foo <- function(x) sd(x) * .1 # arbitrary user-defined function
agg_funcs <- c(mean, median, foo)
names(agg_funcs) <- c("mean", "median", "foo")
fields <- c("mpg", "disp") # fields to aggregate with agg_funcs
fields %>%
set_names(fields) %>%
map_df(function(x) map_df(agg_funcs, function(f) f(mtcars[[x]])), .id = "field")
# A tibble: 2 x 4
field mean median foo
<chr> <dbl> <dbl> <dbl>
1 mpg 20.1 19.2 0.603
2 disp 231. 196. 12.4
但我不想手动命名agg_funcs
中的函数。相反,我想做一些类似
agg_funcs %>% set_names(agg_funcs) # doesn't work
我知道我可以获得函数名的字符串表示形式,如下所示:
as.character(substitute(mean))
# "mean"
我甚至可以将此操作包装在一个函数中,并逐个传递我想要的agg函数:
f <- function(func) as.character(substitute(func))
f(mean) # "mean"
此函数f()
是我希望在上面的嵌套map
操作中使用的类型,以获取字符串形式的函数名称。
但当我尝试map
或sapply
覆盖agg_funcs
(原因我不完全理解)时,此操作失败:
sapply(agg_funcs, f) # alt: map(agg_funcs, f)
mean median foo
[1,] "[[" "[[" "[["
[2,] "X" "X" "X"
[3,] "i" "i" "i"
如何在不手动创建names(agg_funcs)
的情况下获得所需的结果(函数名称作为映射输出df中的列)?
推荐答案
我们可以使用lst
Fromdplyr
或purrr
,这将返回相同参数的命名list
dplyr::lst(mean, median, foo)
这篇关于获取传递到另一个函数的函数向量的字符串名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文