【问题标题】:Why can't I unquote this quosure?为什么我不能取消引用这个quosure?
【发布时间】:2019-02-16 13:21:44
【问题描述】:

我正在阅读关于准引用的一些注释:https://dplyr.tidyverse.org/articles/programming.html

在我第一次阅读之后,我尝试了一些东西。有一个特别让我感到困惑:

x <- "foo"
q <- quo(x)

print(x)
<quosure>
expr: ^x
env:  global

太好了,我创建了一个quosure!然后我想

!!q

将立即计算表达式,产生“foo”。当然,这是错误的!

!!q
Error in !q : invalid argument type

我不明白为什么。我错过了什么?


运行: R版本3.5.1(2018-07-02)——“羽毛喷雾” 版权所有 (C) 2018 统计计算 R 基金会 平台:x86_64-pc-linux-gnu(64位)

软件包 rlang 版本:0.2.1

【问题讨论】:

  • 顺便说一句,我正在编写一个 tidyeval bookdown。 WIP,但它应该已经比 dplyr vignette tidyeval.tidyverse.org
  • 期待!
  • FWIW,我发现这些位很有帮助:“确定这些变量在何处传递给其他引用函数并用 !! 取消引用 ...我们最终得到一个自动引用其参数 group_var 和 summary_var 的函数,并且当它们被传递给其他引用函数时取消引用它们。”建立 dplyr 函数是引用函数的连接是有帮助的。此外,UQ() 提供的错误信息比 !! - 你不只是使用 !!在开放代码中。
  • 是的,这是 tidyeval UI 最大的缺点,!! 不是真正的运算符,所以在 tidyeval 函数之外使用它不一定会出错,它会尝试占用对其论点的双重否定。

标签: r tidyverse tidyeval quosure quasiquotes


【解决方案1】:

我测试了你的方法,你部分正确。

可以使用!!q,但只能在准引用环境中使用。

> !! q
  Error in !q : invalid argument type
> UQ(q)
  Error: `UQ()` can only be used within a quasiquoted argument
> quo(!! q)
  <quosure>
  expr: ^x
  env:  global
> quo(!!q)
  <quosure>
  expr: ^x
  env:  global

我同时使用了UQ!! 来确保我的答案始终如一

【讨论】:

    猜你喜欢
    • 2018-01-10
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 2015-12-09
    • 2022-01-12
    • 2013-07-09
    • 2012-12-28
    • 1970-01-01
    相关资源
    最近更新 更多