什么时候应该在data.table中使用:=运算符?

data.table对象现在有一个:=运算符。 是什么让这个运算符不同于其他赋值运算符? 另外,它的用途是什么,它有多快,什么时候应该避免?

这里是一个例子,显示10分钟减less到1秒(从主页上的 NEWS)。 这就像data.frame到一个data.frame但不是每次都复制整个表。

 m = matrix(1,nrow=100000,ncol=100) DF = as.data.frame(m) DT = as.data.table(m) system.time(for (i in 1:1000) DF[i,1] <- i) user system elapsed 287.062 302.627 591.984 system.time(for (i in 1:1000) DT[i,V1:=i]) user system elapsed 1.148 0.000 1.158 ( 511 times faster ) 

j放入:=允许更多的习语:

 DT["a",done:=TRUE] # binary search for group 'a' and set a flag DT[,newcol:=42] # add a new column by reference (no copy of existing data) DT[,col:=NULL] # remove a column by reference 

和:

 DT[,newcol:=sum(v),by=group] # like a fast transform() by group 

我想不出任何理由来避免:= ! 除了for循环之外。 由于:=出现在DT[...]内部,它带来了[.data.table方法的小开销; 例如,S3派遣和检查参数的存在和types,如ibynomatch等。因此, for循环内部for ,有一个低开销的直接版本:= called set 。 请参阅?set更多的细节和例子。 set的缺点包括, i必须是行号(无二进制search),你不能与它结合。 通过set这些限制可以显着降低开销。

 system.time(for (i in 1:1000) set(DT,i,"V1",i)) user system elapsed 0.016 0.000 0.018