【问题标题】:How is {rlang}'s 'curly-curly' operator `{{` implemented?{rlang} 的'curly-curly' 操作符 `{{` 是如何实现的?
【发布时间】:2021-11-25 22:44:27
【问题描述】:

help("nse-force") 上的 {rlang} 文档提供以下内容:

函数参数的花括号运算符 {{ }} 有点特殊,因为它强制函数参数并立即将其化解。解析后的表达式被替换,准备在另一个上下文中进行评估,例如数据框。

我同样对“bang-bang”运算符!! 感到困惑,关于它的文档对于幕后发生的事情同样迟钝。

我的问题不是关于如何使用 运算符,因为它的用法(我认为)非常简单。相反,我想知道在幕后{rlang} 中如何实际实现这样的运算符。根据package authors之一,{{ foo }}基本上变成!!rlang::enquo(foo)。但是,我仍然无法理解像这样的非标准运算符实际上是如何实现的,特别是考虑到这个似乎“正常工作”,不管它是否被{rlang} 函数。实际上它适用于由 {rlang} 支持的函数 - 感谢@Konrad Rudolph 的更正。

看着the source code,我只能猜测它是用C 或C++ 完成的。谁能给我更多的信息?

【问题讨论】:

  • 小评:我觉得标题有点含糊。我建议将问题从“X 如何工作?”中重命名。到“X是如何实现的?”。
  • 好建议 - 谢谢!

标签: r tidyverse metaprogramming rlang nse


【解决方案1】:

但是我仍然无法理解像这样的非标准运算符实际上是如何实现的,特别是考虑到这个似乎“正常工作”,无论它是否被{rlang} 函数。

“只适用于”任意函数——相反:函数确实需要注意整洁的评估。正如您可能猜到的那样,没有{{ 运算符。相反,“rlang”使用 NSE 来捕获未评估的参数,然后检查表达式的解析树是否包含两个嵌套的 { 调用。然后它采用未计算的表达式并对其进行适当的转换。

【讨论】:

  • 谢谢,这完全有道理,你是对的,我误认为它与非 rlang 函数一起使用。你能链接到 github 上的代码吗?
  • @BluVoxe 卷曲“运算符”的实际识别发生在这里:github.com/r-lib/rlang/blob/…;转变为 bang-bang-enquo 发生在这里:github.com/r-lib/rlang/blob/…。但我想强调的是,整个事情都可以在纯 R 中实现,尽管效率较低。
  • 对于其他人来说,实现该功能的实际拉取请求是 here
猜你喜欢
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 2020-11-25
  • 2018-09-08
相关资源
最近更新 更多