25

我遇到了流行的data.table包裹,特别是一件事让我很感兴趣。它有一个就地赋值运算符

:=

这在基础 R 中没有定义。事实上,如果您没有加载data.table包,如果您尝试使用它(例如,a := 2)会引发错误,并显示以下消息:

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

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

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

"abc" := "def"

显然,它并不是%function.name%定义中缀函数的替代语法。是在data.table利用 R 的一些解析怪癖吗?是黑客吗?以后会“打补丁”吗?

4

2 回答 2

33

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

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

据我所知,它是无证的(就基本 R 而言)。但它是一个函数/运算符,您可以更改其行为

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

如您所见,“:”部分本身并没有什么特别之处。它恰好是复合令牌的开始。

于 2014-10-09T02:54:57.413 回答
10

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

于 2014-10-09T02:56:34.853 回答