首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >前缀!具有包名的rlang

前缀!具有包名的rlang
EN

Stack Overflow用户
提问于 2021-12-23 16:32:16
回答 2查看 86关注 0票数 0

是否可以这样使用!!!

代码语言:javascript
复制
dplyr::count(df, rlang::`!!!`(rlang::syms(variables)))

而不是:

代码语言:javascript
复制
dplyr::count(df, !!!syms(variables))

编辑:

这是不可能的。

所以现在问题变成了使用!!!的替代方案是什么

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-23 16:35:01

不使用rlang,我们可以在across中使用all_of

代码语言:javascript
复制
library(dplyr)
df %>%
   count(across(all_of(variables)))
票数 2
EN

Stack Overflow用户

发布于 2021-12-23 17:25:17

rlang中有一些被称为UQ()UQS() (取消引用和取消引用-拼接)的软引用函数。但它们也不应该与rlang::一起使用。

简而言之,只需使用!!!**.**

但这里有一个例子,说明你在问什么。

代码语言:javascript
复制
df <- mtcars
variables <- c("cyl", "gear")

dplyr::count(df, rlang::UQS(syms(variables)))

如果你这样做,它会对你大喊大叫的。

代码语言:javascript
复制
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解析器都加强了这一点。实际上,不引用不是一个函数调用,而是一个句法操作。运算符形式清楚地表明取消引用是特殊的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70464905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档