如何在自定义函数中向dplyr的join函数传递未引用变量作为by参数?
解决left_join中传递引用变量名的问题
我来帮你搞定这个报错问题!你遇到的错误是因为enquo(x)返回的是一个quosure对象(带环境的表达式),而left_join的by参数需要的是字符向量,直接把quosure放到c(x = x)里会导致类型不匹配,R没法把它当作向量处理,所以才会抛出'match' requires vector arguments的错误。
下面给你两种可行的解决方案:
方案1:用as_label()转换为字符串
我们可以把捕获到的quosure转换成字符串,再用setNames构建符合要求的命名向量:
library(dplyr) ff <- function(x) { x <- enquo(x) # 将quosure转换为变量名字符串 x_col <- as_label(x) # 构建和c('mpg' = 'mpg')等价的命名向量 left_join(mtcars, mtcars, by = setNames(x_col, x_col)) } # 测试调用 ff(mpg)
方案2:用rlang::as_name()配合解引用
另一种方式是用rlang::as_name()提取变量名,再通过!!(解引用运算符)直接插入到命名向量中:
library(dplyr) library(rlang) ff <- function(x) { x <- enquo(x) x_name <- as_name(x) # 用!!解引用字符串,构建命名对 left_join(mtcars, mtcars, by = c(!!x_name := !!x_name)) } # 测试调用 ff(mpg)
这两种方法都能让你调用ff(mpg)时,得到和left_join(mtcars, mtcars, by = c('mpg' = 'mpg'))完全一致的结果。
内容的提问来源于stack exchange,提问作者Dambo
相关产品推荐
相关产品推荐

