是否可以这样使用!!!:
dplyr::count(df, rlang::`!!!`(rlang::syms(variables)))而不是:
dplyr::count(df, !!!syms(variables))编辑:
这是不可能的。
所以现在问题变成了使用!!!的替代方案是什么
发布于 2021-12-23 16:35:01
不使用rlang,我们可以在across中使用all_of
library(dplyr)
df %>%
count(across(all_of(variables)))发布于 2021-12-23 17:25:17
在rlang中有一些被称为UQ()和UQS() (取消引用和取消引用-拼接)的软引用函数。但它们也不应该与rlang::一起使用。
简而言之,只需使用!!!**.**
但这里有一个例子,说明你在问什么。
df <- mtcars
variables <- c("cyl", "gear")
dplyr::count(df, rlang::UQS(syms(variables)))如果你这样做,它会对你大喊大叫的。
Warning message:
Prefixing `UQS()` with the rlang namespace is deprecated as of rlang 0.3.0.
Please use the non-prefixed form or `!!!` instead.
# Bad:
rlang::expr(mean(rlang::UQS(args)))
# Ok:
rlang::expr(mean(UQS(args)))
# Good:
rlang::expr(mean(!!!args))这是help("nse-force")的一个摘录。
使用rlang名称空间限定符调用UQ()和UQS()的
在rlang0.3.0中被取消。只需使用不限定的表单:Bad rlang::expr(平均(rlang::UQ(Var)*100)# Ok rlang::expr(均值(UQ(Var)* 100)) # Good::expr(均数(!var* 100)),支持名称空间的限定符使单引号的实现复杂化,并对未引用运算符的性质产生误导(这些运算符是在引号时操作的语法运算符,而不是在计算时调用函数)。
在rlang0.2.0中,UQ()和UQS()被软引用,以使准引用的语法更加一致。前缀形式现在是!!()和!!!(),它们与其他R运算符一致(例如,+(a,b)是a+b的前缀形式)。
请注意,前缀表单不像以前那么相关了,因为!!现在具有正确的运算符优先级,即与一元-或+相同。因此,将它与其他操作符混合使用是安全的,例如!a+!B做正确的事情。此外,解析器现在在未引用的表达式周围去掉一个水平的括号。(!“foo”)(.)扩展到foo(.)这些更改使前缀表单变得不那么有用。
最后,命名的functional ()和UQS()具有误导性,因为它们认为现有的函数知识适用于准引用。rlang导出的这些函数的可见定义以及解释rlang::UQ() as !!的整洁的eval解析器都加强了这一点。实际上,不引用不是一个函数调用,而是一个句法操作。运算符形式清楚地表明取消引用是特殊的。
https://stackoverflow.com/questions/70464905
复制相似问题