获取传递到另一个函数的函数向量的字符串名称 [英] Get string names of a vector of functions passed into another function

查看:5
本文介绍了获取传递到另一个函数的函数向量的字符串名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一系列聚合函数,我希望将它们应用于数据框中的多个列(使用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操作中使用的类型,以获取字符串形式的函数名称。 但当我尝试mapsapply覆盖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中的列)?

推荐答案

我们可以使用lstFromdplyrpurrr,这将返回相同参数的命名list

dplyr::lst(mean, median, foo)

这篇关于获取传递到另一个函数的函数向量的字符串名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆