R问题:使用map将函数列表转换为函数名称的字符串列表

Posted

技术标签:

【中文标题】R问题:使用map将函数列表转换为函数名称的字符串列表【英文标题】:R question: Use map to convert a list of functions to a list of strings of their function names 【发布时间】:2021-08-12 22:49:15 【问题描述】:

如果我想将函数名转换成字符串,我可以这样做:

deparse(substitute(mean))

这将返回: [1] “意思”

如果我想对函数列表执行此操作,如何创建将其名称转换为字符串的函数(例如 get_function_name_as_string)?例如,

map( list(mean, median, sum), get_function_name_as_string )

这将返回: [1] “平均” “中位数” “总和”

我试过了:

map( list(mean, median, sum), ~deparse(substitute(.)) )

但这会给我:

[[1]] [1] “..1”

[[2]] [1] “..1”

[[3]] [1] “..1”

解决这个问题后,我可以将汇总函数的名称动态分配给包含汇总数据的列表:

my_func <- list( mean, median, sum) 

 

tables <- map( my_func,  
                 function(func)  iris %>%  
                               group_by(Species) %>%
                               summarise( across( contains("."), func)) %>%
                               ungroup()
 )

# instead of hard coding the names of the functions here, 
# I can dynamically generate the names using my_func.
names(tables) <- c("mean", "median", "sum")

# so instead I can use:
names(tables) <- map(my_func, get_function_name_as_string)


【问题讨论】:

为什么不创建一个函数列表,然后使用常规的 dplyr 合成器调用它,就像在 iris%&gt;%group_by(Species)%&gt;%summarise(across(contains("."), my_func)) 中一样?如果您使用实际对象而不是提取它们的名称以便稍后通过名称调用它们,通常会更安全、更容易实现 我认为这种复杂的策略与常规 dplyr 相比没有任何优势。 谢谢@GuedesBF,但您的解决方案没有给我三张表,一张表示平均值,一张表示中位数,一张表示总和? 请看下面我的回答,告诉你是否需要别的东西 【参考方案1】:

我知道这不是您所要求的,但我认为您提出的方法有更好的替代方案。

为什么不直接创建一个函数列表,然后使用常规的 dplyr 合成器调用它呢?如果您使用实际的对象而不是提取它们的名称以便稍后通过名称调用它们,则通常更安全且更容易实现。

您可以将map()my_func() 作为.x 参数。

举个例子

1-) 创建函数的命名列表:

my_func <- list(mean=mean, median=median, sum=sum)

2-) 在函数调用结束时使用.x=my_func().x 作为my_func() 的占位符调用map():

map(.x=my_func, ~iris%>%group_by(Species)%>%summarise(across(contains("."), .x)))

$mean
# A tibble: 3 x 5
  Species    Sepal.Length Sepal.Width Petal.Length Petal.Width
  <fct>             <dbl>       <dbl>        <dbl>       <dbl>
1 setosa             5.01        3.43         1.46       0.246
2 versicolor         5.94        2.77         4.26       1.33 
3 virginica          6.59        2.97         5.55       2.03 

$median
# A tibble: 3 x 5
  Species    Sepal.Length Sepal.Width Petal.Length Petal.Width
  <fct>             <dbl>       <dbl>        <dbl>       <dbl>
1 setosa              5           3.4         1.5          0.2
2 versicolor          5.9         2.8         4.35         1.3
3 virginica           6.5         3           5.55         2  

$sum
# A tibble: 3 x 5
  Species    Sepal.Length Sepal.Width Petal.Length Petal.Width
  <fct>             <dbl>       <dbl>        <dbl>       <dbl>
1 setosa             250.        171.         73.1        12.3
2 versicolor         297.        138.        213          66.3
3 virginica          329.        149.        278.        101. 

【讨论】:

以上是关于R问题:使用map将函数列表转换为函数名称的字符串列表的主要内容,如果未能解决你的问题,请参考以下文章

如何将飞镖函数名称转换为字符串?

R中的函数:使用list参数作为字符串[duplicate]

R语言dplyr包使用recode函数进行数据列内容编码转换实战:类似于pandas中的map函数(例如,将内容从字符串映射到数值)

如何将 ICD9 和 ICD10 代码列表转换为 R 中的含义(英文名称)?

将列表中的所有字符串转换为int

如何使用Ramda将对象数组转换为列表