在dplyr自定义函数中如何将参数求值为字符串?
解决方法
要把.field参数转换为对应的字段名字符串,你可以利用rlang包的ensym()和as_name()函数(tidyverse工具链自带该包,无需额外安装),具体实现如下:
- 在函数开头捕获
.field对应的符号并转为字符串; - 在
pivot_longer的values_to参数中使用这个字符串。
修改后的完整代码:
library(dplyr) library(tidyr) mean_sd <- function(.data, .field){ # 将.field转换为字段名字符串 .field_name <- rlang::as_name(rlang::ensym(.field)) .data %>% summarise( mean = mean({{.field}}), sd = sd({{.field}}) ) %>% pivot_longer( everything(), names_to = "stat", values_to = .field_name # 这里使用转换后的字段名字符串 ) %>% mutate(across(is.numeric, ~round(.x, 2))) } # 测试函数 mean_sd(mtcars, mpg)
代码说明
rlang::ensym(.field):把传入的.field参数(比如mpg)转换为R的符号对象;rlang::as_name():把符号对象转为对应的字符串(比如将mpg符号转为"mpg");summarise里的{{.field}}保留tidyeval用法,正常计算均值和标准差;pivot_longer的values_to现在会使用实际传入的字段名作为列名,而非固定的.field。
运行测试代码后,输出结果的列名会是stat和mpg,完全符合预期。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

