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

时间:2014-10-09 02:37:41

标签: r data.table colon-equals

我遇到过流行的data.table套餐,有一件事特别引起了我的兴趣。它有一个就地赋值运算符

  

:=

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

  

错误:找不到函数":="

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

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

"abc" := "def"

显然,它并不意味着成为%function.name%的替代语法来定义中缀函数。 data.table利用R的一些解析怪癖吗?这是一个黑客?它将来会被“修补”吗?

2 个答案:

答案 0 :(得分:31)

基本R解析器识别并且似乎解析为左分配(至少在操作的术语或顺序等)。有关详细信息,请参阅C source code

as.list(parse(text="a:=3")[[1]])
# [[1]]
# `:=`
# 
# [[2]]
# a
# 
# [[3]]
# [1] 3

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

的行为
`:=`<-function(a,b) {a+b}
3 := 7
# [1] 10

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

答案 1 :(得分:7)

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