在自定义dplyr包装函数中使用带引号的变量

在自定义dplyr包装函数中使用带引号的变量,r,dplyr,rlang,tidyselect,R,Dplyr,Rlang,Tidyselect,我的问题如下。我有一个函数foo,它在dplyr::mutate内部工作。此函数接受tidyselect语法。我想构建一个包装函数bar,它还应该支持tidyselect语法。我正在寻找一种干净的方法,将tidyselected列从bar传递到foo。听起来很简单,但问题是foo需要接受将被引用的裸用户输入,还需要接受来自包装器函数的已被引用的列 让我们来看看这个问题: 库(dplyr) 虹膜2 4.9 3 1.4 0.2刚毛4.9 #>3 4.7 3.2 1.3 0.2 setosa 4.7

我的问题如下。我有一个函数
foo
,它在
dplyr::mutate
内部工作。此函数接受
tidyselect
语法。我想构建一个包装函数
bar
,它还应该支持
tidyselect
语法。我正在寻找一种干净的方法,将
tidyselect
ed列从
bar
传递到
foo
。听起来很简单,但问题是
foo
需要接受将被引用的裸用户输入,还需要接受来自包装器函数的已被引用的列

让我们来看看这个问题:

库(dplyr)
虹膜2 4.9 3 1.4 0.2刚毛4.9
#>3 4.7 3.2 1.3 0.2 setosa 4.7
#>4.6 3.1 1.5 0.2 setosa 4.6
#>5 3.6 1.4 0.2刚毛5
#>6 5.4 3.9 1.7 0.4刚毛5.4
#>7 4.6 3.4 1.4 0.3 setosa 4.6
#>8 5 3.4 1.5 0.2刚毛5
#>9 4.4 2.9 1.4 0.2 setosa 4.4
#>10 4.9 3.1 1.5 0.1 setosa 4.9
#>#…还有140行
#这是一个围绕“foo”的包装函数`
条注:在选择中使用外部向量是不明确的。
#> ℹ 使用“all_of(.cols)`而不是“.cols”使此消息静音。
#> ℹ 看见
#>此消息在每个会话中显示一次。
#>错误:“mutate()”输入“…1”有问题。
#>x必须使用有效的下标向量来子集列。
#>x下标的类型“quosure/formula”错误。
#> ℹ 它必须是数字或字符。
#> ℹ 输入“…1”是“foo(.cols)”。
由(v0.3.0)于2021年4月14日创建

以上这些都不起作用,这是完全有道理的。对于我来说,不明显的是如何以干净一致的方式处理这个问题

下面我将展示我所做的尝试,以及我想出的平庸的解决方法

我想我能做的是:检查这些列是否已经被引用,如果没有被引用的话,请将它们引用起来。然而,这似乎是不可能的。一旦无引号的列用于任何类型的操作,将对其进行评估和更改。
enquo
必须首先发生。但如果它先发生,我无法检查它们是否已经被引用过

#我们需要签入foo
#是否已引用cols
#但这似乎不可能
#因为“cols”一经使用/触摸就会发生变化
foo 6 5.4 3.9 1.7 0.4 setosa 5.4
#>7 4.6 3.4 1.4 0.3 setosa 4.6
#>8 5 3.4 1.5 0.2刚毛5
#>9 4.4 2.9 1.4 0.2 setosa 4.4
#>10 4.9 3.1 1.5 0.1 setosa 4.9
#>#…还有140行
#工作
myiris%>%
条(萼片长度)
#>#A tible:150 x 6
#>萼片。长萼片。宽花瓣。长花瓣。宽种新萼片。长
#>                                                
#>1 5.1 3.5 1.4 0.2 setosa 5.1
#>2 4.9 3 1.4 0.2刚毛4.9
#>3 4.7 3.2 1.3 0.2 setosa 4.7
#>4.6 3.1 1.5 0.2 setosa 4.6
#>5 3.6 1.4 0.2刚毛5
#>6 5.4 3.9 1.7 0.4刚毛5.4
#>7 4.6 3.4 1.4 0.3 setosa 4.6
#>8 5 3.4 1.5 0.2刚毛5
#>9 4.4 2.9 1.4 0.2 setosa 4.4
#>10 4.9 3.1 1.5 0.1 setosa 4.9
#>#…还有140行

由(v0.3.0)创建于2021-04-14可能我不理解这个用例,但是当您将列从
bar()
传递到
foo()
时,为什么必须引用这些列呢?如果您取消引用输入,则一切都会按预期进行:

bar <- function(df, .cols) {
  .cols <- rlang::enquo(.cols)
  mutate(df, foo(!!.cols))      # <--- unquote before passing to foo()
}

# Or alternatively
bar <- function(df, .cols) {mutate(df, foo( {{.cols}} ))}

myiris %>%
  bar(Sepal.Length)             # works

bar我可以发誓我试过这个,但它抛出了一个错误,但很明显它工作正常,当我检查它时,我一定是在其他地方出了什么问题。谢谢你解决这个问题。