You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在purrr::map中转换函数名为字符串时遇‘无法转为符号’错误的问询

问题解决:批量将函数转换为字符串并应用到数据框

错误原因

你编写的function_to_string使用rlang::ensym(fun)捕获传入的符号(函数名),单独调用时(如function_to_string(mean)),传入的是符号mean,因此能正常转换为字符串。但使用c(mean, sd)时,mean和sd会被直接求值为函数对象,而非符号;purrr::map遍历这些函数对象时,ensym无法将函数对象转换为符号,因此抛出Can't convert to a symbol错误。

解决方案

方案1:修改转换函数,适配函数对象

使用rlang::fn_name()直接提取函数对象的名称字符串,该函数支持处理符号和函数对象两种输入:

library(rlang)
library(purrr)

function_to_string <- function(fun) {
  fn_name(fun)
}

# 单独调用验证
function_to_string(mean)
#> [1] "mean"
function_to_string(sd)
#> [1] "sd"

# 批量转换函数对象
purrr::map(c(mean, sd), function_to_string)
#> [[1]]
#> [1] "mean"
#> 
#> [[2]]
#> [1] "sd"

方案2:命名函数列表+数据框批量处理(贴合最终需求)

如果你的目标是对数据框应用多个函数,并用函数名作为列名,推荐使用命名函数列表,结合dplyr或purrr实现更高效的批量处理:

library(dplyr)
library(purrr)

# 定义命名函数列表(键为函数名,值为函数对象)
funs_list <- list(均值 = mean, 标准差 = sd)

# 对数据框列应用函数,直接用列表键作为列名
mtcars %>% 
  summarize(across(mpg, !!!funs_list))
#>    均值 标准差
#> 1 20.09  6.027

或者用purrr的map_dfr整理结果:

map_dfr(funs_list, ~ .x(mtcars$mpg), .id = "统计量")
#> # A tibble: 2 × 2
#>   统计量  value
#>   <chr>   <dbl>
#> 1 均值     20.1
#> 2 标准差    6.03

内容的提问来源于stack exchange,提问作者jcken

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 19:56:21