我遇到过流行的data.table
套餐,有一件事特别引起了我的兴趣。它有一个就地赋值运算符
:=
这在基础R中没有定义。实际上如果你没有加载data.table
包,如果你试图使用它(例如,a := 2
),它会引发错误消息:
错误:找不到函数
":="
另外,为什么:=
有效?为什么R允许您将:=
定义为中缀运算符,而其他每个中缀函数都必须被%%
包围,例如
`:=` <- function(a, b) {
paste(a,b)
}
"abc" := "def"
显然,它并不意味着成为%function.name%
的替代语法来定义中缀函数。 data.table
利用R的一些解析怪癖吗?这是一个黑客?它将来会被“修补”吗?
答案 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参数指定的列创建或赋值。