R问题:使用map将函数列表转换为函数名的字符串列表
R question: Use map to convert a list of functions to a list of strings of their function names
如果我想把一个函数名转换成一个字符串,我可以这样做:
deparse(substitute(mean))
这会 return:
[1]“意思”
如果我想对函数列表执行此操作怎么办,如何创建将函数名称转换为字符串的函数(例如 get_function_name_as_string)?例如,
map( list(mean, median, sum), get_function_name_as_string )
这会 return:
[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 synthax 调用它?如果您使用实际对象而不是仅提取它们的名称以便稍后按名称调用它们,通常更安全且更容易实现。
您可以 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.
如果我想把一个函数名转换成一个字符串,我可以这样做:
deparse(substitute(mean))
这会 return: [1]“意思”
如果我想对函数列表执行此操作怎么办,如何创建将函数名称转换为字符串的函数(例如 get_function_name_as_string)?例如,
map( list(mean, median, sum), get_function_name_as_string )
这会 return: [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 synthax 调用它?如果您使用实际对象而不是仅提取它们的名称以便稍后按名称调用它们,通常更安全且更容易实现。
您可以 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.