如果我想将函数名转换为字符串,我可以这样做:
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 合成器调用它?如果您使用实际对象而不是提取它们的名称只是稍后通过名称来调用它们,那么通常会更安全且更容易实现。
您可以
map()
将 my_func()
作为 .x
参数。
举个例子
1-) 创建命名函数列表:
my_func <- list(mean=mean, median=median, sum=sum)
2-) 使用
.x=my_func()
调用 map(),并在函数调用结束时将 .x
作为 my_func()
的占位符:
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.