R tidy eval场景下如何将自定义函数批量映射到数据框多个列
R 自定义非标准评估函数批量遍历列解决方案
你遇到的问题本质是自定义函数使用了rlang的非标准评估逻辑,接收未加引号的裸列名作为参数,直接在全局环境定义c(Department, State)会被识别为搜索全局变量而非数据框列,因此报错。以下是两种可行解决方法:
方案1:不修改原函数,用表达式列表存储列名
使用rlang::exprs()将裸列名存储为表达式列表,调用时用!!注入参数即可:
library(rlang) # 定义要遍历的列名集合 columns <- exprs(Department, State, Position)
调用map的写法如下:
library(purrr) map(columns, ~ emp_term_var(df, colName = !! .x, year = "2015"))
方案2:修改原函数兼容字符串列名,适配你预期的调用形式
如果希望直接传入字符串列名,匹配你给出的map(colnames, ~ emp_term_var(df, colName = .x, year = "2015"))写法,调整原函数的非标准评估逻辑即可:
修改后的自定义函数
emp_term_var <- function(data, colName, year = "2015") { # ensym同时支持裸列名和字符串形式的列名输入 colName <- ensym(colName) term_test <- data %>% filter(year(DateofTermination) == year) %>% # 用!!替代已经弃用的UQ语法,兼容性更好 group_by(!!colName) %>% count(!!colName) %>% clean_names() return(term_test) }
批量调用方法
直接用字符串向量定义列名集合即可:
columns <- c("Department", "State", "Position") # 完全符合你预期的调用形式 map(columns, ~ emp_term_var(df, colName = .x, year = "2015"))
两种方案都可以正常返回和单函数调用格式一致的结果列表,方案2的兼容性更强,支持直接传入数据框的colnames()返回值批量遍历所有列。
内容的提问来源于stack exchange,提问作者Taren Shaw
相关产品推荐
相关产品推荐

