为什么:=允许作为中缀运算符?

xia*_*dai 21 r data.table colon-equals

我遇到了流行的data.table包装,有一件事特别引起了我的兴趣.它有一个就地分配操作符

:=

这在基础R中没有定义.事实上,如果你没有加载data.table包,如果你试图使用它(例如a := 2),它会引发错误:

错误:无法找到功能 ":="

另外,为什么:=工作?为什么R允许您定义:=为中缀运算符,而其他每个中缀函数都必须被包围%%,例如

`:=` <- function(a, b) {
   paste(a,b)
}

"abc" := "def"
Run Code Online (Sandbox Code Playgroud)

显然,它并不是%function.name%用于定义中缀函数的替代语法.正在data.table利用R的一些解析怪癖?这是一个黑客?它将来会被"修补"吗?

MrF*_*ick 31

它是基本R解析器识别并且似乎作为左分配解析的东西(至少在操作的术语或顺序等).有关更多详细信息,请参阅C源代码.

as.list(parse(text="a:=3")[[1]])
# [[1]]
# `:=`
# 
# [[2]]
# a
# 
# [[3]]
# [1] 3
Run Code Online (Sandbox Code Playgroud)

据我所知,它没有记录(就基地R而言).但它是一个函数/运算符,你可以改变它的行为

`:=`<-function(a,b) {a+b}
3 := 7
# [1] 10
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,":"部分本身并没有什么特别之处.它恰好是复合令牌的开始.

  • @BondedDust但是让我们说`data.table`想要将`〜=`定义为新的中缀运算符.他们不能这样做,因为解析器不会识别它(即`parse(text ="a~ = 3")`会产生错误).`:=`的"特殊性"完全独立于`data.table`包.自定义中缀运算符需要`%`的规则是一个很大的例外,它在我阅读它时似乎是OP问题的精神. (15认同)
  • @BondedDust但是`data.table`不拥有*那个函数.他们真的依赖于解析器中无法控制的东西.如果他们喜欢,另一个包可以重新定义`c`.这基本上就是他们正在做的事情(恰好没有`= =`的默认实现) (12认同)
  • +1好工作挖掘源! (3认同)
  • 我猜在某个时候 R Core 正在考虑实现 `:=` 作为 `&lt;-` 的替代方案,因为某些语言将其用作 [赋值运算符](http://stackoverflow.com/questions/5344694/what -does-do),但在编写解析器后放弃了这个想法。 (2认同)

42-*_*42- 7

它不仅仅是冒号运算符,而是:=由冒号和等号组成的单个运算符(正如"<"和" - "的组合形成基数R中的赋值运算符).的:=运算符是被定义为内侧的"J"参数的评估的一部分中缀函数[.data.table功能.它使用评估其RHS的结果为其LHS参数指定的列创建或赋值.

  • 对那些没有解释他们的担忧的跪拜者.写这个答案是为了回答最初写的问题.您可以通过单击"编辑的...."链接查看其原始标题和内容. (4认同)