R语言如何使用map将函数列表转换为对应函数名字符串列表
R语言函数列表动态提取函数名解决方案
问题本质
你尝试的写法失效的核心原因是:substitute() 仅能捕获当前执行环境下的参数符号,purrr::map 遍历列表时,传入迭代函数的元素会被绑定到..1这类内部形参上,所以捕获不到原始的函数符号名。
额外说明:R中函数对象被求值后就会和原符号名解绑,无法从已经完全求值的函数列表中反推原始符号名,所有提取方案都需要在符号被求值前完成捕获。
最优极简方案(推荐)
直接使用tibble包的lst()函数构造函数列表,它会自动将输入的符号名作为列表元素的名称,无需额外编写提取函数:
library(tidyverse) # lst()会自动用符号名作为列表元素名 my_func <- lst(mean, median, sum) # 直接输出名称验证:返回 "mean" "median" "sum" names(my_func) # 后续处理逻辑不变 tables <- map( my_func, function(func){ iris %>% group_by(Species) %>% summarise( across( contains("."), func)) %>% ungroup() } ) # 不需要额外赋值names,tables已经继承了my_func的元素名
自定义函数实现方案
如果你需要自行实现提取逻辑,可以用非标准求值捕获列表构造时的表达式:
get_func_list_names <- function(func_list_expr) { # 捕获未求值的列表表达式 expr <- enexpr(func_list_expr) if (expr[[1]] != as.symbol("list")) { stop("请传入list()构造的表达式作为参数") } # 提取所有元素的符号名并转为字符串 map_chr(as.list(expr)[-1], deparse) } # 测试效果 func_names <- get_func_list_names(list(mean, median, sum)) # 返回 "mean" "median" "sum"
对应你的使用场景:
my_func <- list(mean, median, sum) names(my_func) <- get_func_list_names(list(mean, median, sum)) tables <- map( my_func, function(func){ iris %>% group_by(Species) %>% summarise( across( contains("."), func)) %>% ungroup() } )
内容的提问来源于stack exchange,提问作者Ignatius Pang
相关产品推荐
相关产品推荐

