R 如何将列名称的tidyselect样式列表拼接到my函数的调用中

R 如何将列名称的tidyselect样式列表拼接到my函数的调用中,r,tidyverse,tidyselect,R,Tidyverse,Tidyselect,我正在尝试编写一个函数来消除分组数据帧中的重复数据。它断言每个组中的值都是相同的,然后只保留组的第一行。我试图给它提供类似于中所示的tidyselect的语义,因为我只需要将列名转发到摘要(a=n_distinct(…)调用中 以一个示例表为例 test% 分组人(G) 我希望调用删除\u重复项(test,c(v1,v2))(使用tidyselect助手返回 G F v1 v2 A a 1 2 B a 1 2 但我明白了 Error: `arg` must b

我正在尝试编写一个函数来消除分组数据帧中的重复数据。它断言每个组中的值都是相同的,然后只保留组的第一行。我试图给它提供类似于中所示的tidyselect的语义,因为我只需要将列名转发到
摘要(a=n_distinct(…)
调用中

以一个示例表为例

test%
分组人(G)
我希望调用
删除\u重复项(test,c(v1,v2))
(使用tidyselect助手返回

G   F  v1  v2
A   a   1   2
B   a   1   2
但我明白了

Error: `arg` must be a symbol
我尝试使用新的语法来解决这个问题(请参阅下面的函数代码),但由于上面显示的消息而失败

#断言每个组中的值是相同的,并保留每个组的第一行
#团体
#选项卡:一个分组的选项卡
#变量:整个组中的列应为常量
删除重复项%
总结(a=n_distinct({{{vars}}})=1、.groups=“drop”)%>%
{stopifnot(全部(.$a))}
#删除重复项
制表符%
切片(1)%>%
解组()
返回(选项卡)
}
我认为我需要以某种方式指定表达式
vars
的计算上下文必须更改为
tab
的子数据框,该子数据框当前由
substitute
进行计算。 大概是

tab %>%
  summarise(a = do.call(n_distinct, TIDYSELECT_TO_LIST_OF_VECTORS(vars, context = CURRENT_GROUP))))

但我对技术细节的了解还不够,无法真正实现这一点……

如果您首先
enquos
您的
vars
然后对结果使用curly-curly运算符,则这一点与预期的效果相同:

删除重复项%
{stopifnot(全部(.$a))}
选项卡%>%slice(1)%%>%ungroup()
}
所以现在

删除重复项(测试,c(v1,v2))
#>#A tibble:2 x 4
#>G F v1 v2
#>      
#>1A 12
#>2 B a 3 3

太棒了,谢谢!但是,我不明白为什么会有新的
{
操作符。因为如果我写
!!vars
而不是
{vars}
它也能工作。
的好处是什么{{
,那么?@akraf这似乎是
n_distinct
的问题,而不是您使用curly-curly操作符的方式。我不知道这是否可能是因为
摘要
n_distinct
都在内部使用
enquos