You need to enable JavaScript to run this app. R语言如何使用map将函数列表转换为对应函数名字符串列表
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 19:15:06