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)
正如你所看到的那样,":"部分本身并没有什么特别之处.它恰好是复合令牌的开始.
它不仅仅是冒号运算符,而是:=由冒号和等号组成的单个运算符(正如"<"和" - "的组合形成基数R中的赋值运算符).的:=运算符是被定义为内侧的"J"参数的评估的一部分中缀函数[.data.table功能.它使用评估其RHS的结果为其LHS参数指定的列创建或赋值.