如何从dplyr的mutate函数中提取输入列名?
从dplyr::mutate中提取输入列名的方法
要提取mutate调用中涉及的输入列名,可以借助rlang包的表达式解析能力,针对不同的表达式类型(直接列引用、赋值式、across调用等)做针对性处理。以下是具体实现方案:
1. 加载依赖包
library(dplyr) library(rlang)
2. 定义提取函数
extract_mutate_inputs <- function(data, ...) { # 捕获mutate的所有参数表达式 exprs <- enquos(...) # 辅助函数:解析单个表达式,提取输入列/表达式内容 extract_cols <- function(expr) { expr <- get_expr(expr) # 处理across调用:解析其列选择器参数 if (is_call(expr, "across")) { cols_expr <- expr[[2]] cols <- eval_tidy(cols_expr, data) as.character(cols) } # 处理直接引用列的情况(如Species) else if (is_symbol(expr)) { as.character(expr) } # 处理赋值式(如okay = Species):提取右侧表达式 else if (is_call(expr, "=")) { extract_cols(enquo(expr[[3]])) } # 处理其他表达式(如1:150):转为字符串 else { deparse(expr) } } # 遍历所有表达式,提取结果并展开 unlist(lapply(exprs, extract_cols)) }
3. 测试函数
用你提供的示例数据测试:
result <- extract_mutate_inputs(iris, Species, okay = Species, across(c(Species, Sepal.Length), identity, .names = "{.col}_2"), 1:150 ) print(result) #> [1] "Species" "Species" "Species" "Sepal.Length" "1:150"
这个函数能覆盖你示例中的所有场景:直接列引用、赋值式生成新列、across批量处理列,以及纯表达式的情况,最终输出你期望的输入列/表达式列表。
内容的提问来源于stack exchange,提问作者NicChr
相关产品推荐
相关产品推荐

