2

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

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

我同样对 'bang-bang' operator 感到困惑!!,关于它的文档对于幕后发生的事情同样迟钝。

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

查看源代码,我只能猜测它是用 C 或 C++ 完成的。谁能给我更多信息?

4

1 回答 1

6

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

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

于 2021-10-05T16:32:38.590 回答