如何在R函数中保留...参数并正确实现DataFrame左连接?
问题解决方法
你的错误出在left_join的by参数解析上——直接把B, C通过...传进去时,left_join无法识别这些裸变量名,因为它需要的是字符向量或者命名连接规则,而不是未求值的符号。
要保留...参数同时解决问题,可以用dplyr的符号处理工具把...转换成left_join能识别的格式,下面是两种可行方案:
方案1:转换为字符列名(适合同名列连接)
用ensyms()把传入的变量名转换成符号,再转成字符向量,直接作为连接键:
library(tibble) library(dplyr) test_data <- tibble(A = c(1,2), B = c("A", "C"), C = c("f", "m")) myfunction <- function(mydata, ...) { # 将...中的变量名转为字符向量 join_keys <- as.character(ensyms(...)) mydata %>% left_join(mydata, by = join_keys) } # 调用正常运行 myfunction(test_data, B, C)
方案2:支持自定义连接规则(灵活度更高)
如果后续需要处理不同列名的连接(比如左表B连右表D),可以用rlang::list2()把...收集成命名列表,完全兼容left_join的by参数规则:
library(tibble) library(dplyr) library(rlang) test_data <- tibble(A = c(1,2), B = c("A", "C"), C = c("f", "m")) myfunction <- function(mydata, ...) { join_spec <- list2(...) mydata %>% left_join(mydata, by = join_spec) } # 同名列连接调用 myfunction(test_data, B, C) # 自定义列名连接示例(如果有对应场景) # myfunction(test_data, left_B = B, right_C = C)
这两种方案都不会影响你后续用...做分组操作,比如在函数里加group_by(...)依然可以正常使用裸变量名传参。
内容的提问来源于stack exchange,提问作者arnyeinstein
相关产品推荐
相关产品推荐

