在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
相关产品推荐
相关产品推荐

