如何将参数传递给函数内的 dplyr 连接函数?

Dam*_*mbo 5 r dplyr tidyverse rlang

我想将一个不带引号的变量名传递x给一个left_join函数。我期望的输出与我运行的输出相同:

left_join(mtcars, mtcars, by = c('mpg' = 'mpg'))

我正在尝试这个:

 ff <- function(x) {
      x <- enquo(x)
      left_join(mtcars, mtcars, by = c(x = x))
    }
    ff(mpg)
Run Code Online (Sandbox Code Playgroud)

匹配错误(x,表,nomatch = 0L):“匹配”需要向量参数

Tun*_*ung 5

您需要字符串作为输入,by因此您需要使用quo_namebreak aquosure并返回一个字符串。

library(rlang)
library(tidyverse)

ff <- function(x) {
  x <- enquo(x)
  left_join(mtcars, mtcars, by = quo_name(x))
}

head(ff(mpg))
#>    mpg cyl.x disp.x hp.x drat.x  wt.x qsec.x vs.x am.x gear.x carb.x cyl.y
#> 1 21.0     6    160  110   3.90 2.620  16.46    0    1      4      4     6
#> 2 21.0     6    160  110   3.90 2.620  16.46    0    1      4      4     6
#> 3 21.0     6    160  110   3.90 2.875  17.02    0    1      4      4     6
#> 4 21.0     6    160  110   3.90 2.875  17.02    0    1      4      4     6
#> 5 22.8     4    108   93   3.85 2.320  18.61    1    1      4      1     4
#> 6 22.8     4    108   93   3.85 2.320  18.61    1    1      4      1     4
#>   disp.y hp.y drat.y  wt.y qsec.y vs.y am.y gear.y carb.y
#> 1  160.0  110   3.90 2.620  16.46    0    1      4      4
#> 2  160.0  110   3.90 2.875  17.02    0    1      4      4
#> 3  160.0  110   3.90 2.620  16.46    0    1      4      4
#> 4  160.0  110   3.90 2.875  17.02    0    1      4      4
#> 5  108.0   93   3.85 2.320  18.61    1    1      4      1
#> 6  140.8   95   3.92 3.150  22.90    1    0      4      2
Run Code Online (Sandbox Code Playgroud)

要x同时用于 的 LHS 和 RHS by,我们需要使用set_names
Credit to this answer

ff2 <- function(x) {
  x <- enquo(x)
  by = set_names(quo_name(x), quo_name(x))
  left_join(mtcars, mtcars, by = by)
}

head(ff2(mpg))
#>    mpg cyl.x disp.x hp.x drat.x  wt.x qsec.x vs.x am.x gear.x carb.x cyl.y
#> 1 21.0     6    160  110   3.90 2.620  16.46    0    1      4      4     6
#> 2 21.0     6    160  110   3.90 2.620  16.46    0    1      4      4     6
#> 3 21.0     6    160  110   3.90 2.875  17.02    0    1      4      4     6
#> 4 21.0     6    160  110   3.90 2.875  17.02    0    1      4      4     6
#> 5 22.8     4    108   93   3.85 2.320  18.61    1    1      4      1     4
#> 6 22.8     4    108   93   3.85 2.320  18.61    1    1      4      1     4
#>   disp.y hp.y drat.y  wt.y qsec.y vs.y am.y gear.y carb.y
#> 1  160.0  110   3.90 2.620  16.46    0    1      4      4
#> 2  160.0  110   3.90 2.875  17.02    0    1      4      4
#> 3  160.0  110   3.90 2.620  16.46    0    1      4      4
#> 4  160.0  110   3.90 2.875  17.02    0    1      4      4
#> 5  108.0   93   3.85 2.320  18.61    1    1      4      1
#> 6  140.8   95   3.92 3.150  22.90    1    0      4      2
Run Code Online (Sandbox Code Playgroud)