【问题标题】:prefixing !!! with the package name, rlang前缀!!!带有包名,rlang
【发布时间】:2021-12-23 16:32:16
【问题描述】:

是否可以像这样使用!!!

dplyr::count(df, rlang::`!!!`(rlang::syms(variables)))

代替:

dplyr::count(df, !!!syms(variables))

编辑:

这是不可能的。

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

【问题讨论】:

  • 当你用数据尝试它时发生了什么?
  • 确实,我刚试过。它不能
  • !!! 符号不是函数的名称,它只是使用了 3 次的常规运算符 !。只有在 tidyverse 非标准评估中才会按照你想要的方式进行解释。
  • @IceCreamToucan:尝试在控制台中输入rlang::"!!!"(或使用反引号代替引号)。这是一个函数,但不是在表达式中使用 !!! 时调用的函数。
  • 不需要在!!!!!{{前加上rlang::。这些运算符不是函数调用,它们由 rlang 在数据屏蔽参数中专门解释。

标签: r tidyverse rlang tidyeval


【解决方案1】:

我们可以使用all_ofacross,而不是使用rlang

library(dplyr)
df %>%
   count(across(all_of(variables)))

【讨论】:

    【解决方案2】:

    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 0.3.0 开始,不推荐使用 rlang 命名空间限定符调用 UQ() 和 UQS()。只需使用不合格的表格即可:

    # Bad
    rlang::expr(mean(rlang::UQ(var) * 100))
    
    # Ok
    rlang::expr(mean(UQ(var) * 100))
    
    # Good
    rlang::expr(mean(!!var * 100))
    

    支持命名空间限定符会使取消引用的实现复杂化,并且会误导取消引用运算符(它们是在引用时间而不是在评估时间进行函数调用的语法运算符)的性质。

    UQ() 和 UQS() 在 rlang 0.2.0 中被软性弃用,以使 quasiquotation 的语法更加一致。前缀形式现在是 `!!`() 和 `!!!`() 这与其他 R 运算符一致(例如 `+`(a, b) 是 a + b 的前缀形式)。

    请注意,前缀形式不像以前那样相关,因为 !!现在具有正确的运算符优先级,即与一元 - 或 + 相同。因此,将其与其他运算符混合使用是安全的,例如!!a + !!b 做正确的事。此外,解析器现在会在未引用的表达式周围去掉一层括号。这样 (!!"foo")(...) 扩展为 foo(...)。这些变化使前缀形式变得不那么有用了。

    最后,命名的函数形式 UQ() 和 UQS() 具有误导性,因为它们表明有关函数的现有知识适用于准引用。 rlang 导出的这些函数的可见定义以及将 rlang::UQ() 解释为 !! 的 tidy eval 解析器强化了这一点。实际上,取消引用不是函数调用,而是一种语法操作。运算符形式更清楚地表明取消引用是特殊的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 2017-05-04
      • 1970-01-01
      • 2011-05-09
      • 2015-06-05
      • 1970-01-01
      • 2015-01-15
      相关资源
      最近更新 更多