[datatable-help] := unclarity and possible bug?

Chris Neff caneff at gmail.com
Thu Aug 4 14:12:59 CEST 2011


Hi all,

If I do:

DT <- data.table(x=1:10, y=rep(1:2,5))

Then try the following

DT[, z:=5]

I get:

> DT[, z:=5]
z
[1] 5
[1] TRUE
NULL

and if I were to do DT <- DT[, z:=5], then DT gets set to NULL.
Alternatively if I do

DT[1:10, z:=5]

I get

> DT=DT[1:nrow(DT),z:=5]
z
[1] 5
 [1]  1  2  3  4  5  6  7  8  9 10
Error in `:=`(z, 5) :
  Attempt to add new column(s) and set subset of rows at the same
time. Create the new column(s) first, and then you'll be able to
assign to a subset. If i is set to 1:nrow(x) then please remove that
(no need, it's faster without).


Which is more informative. So I do as it instructs:

DT$z <- NA

DT[, z:=5]

And as output I get:

> DT
       x y    z
 [1,]  1 1 TRUE
 [2,]  2 2 TRUE
 [3,]  3 1 TRUE
 [4,]  4 2 TRUE
 [5,]  5 1 TRUE
 [6,]  6 2 TRUE
 [7,]  7 1 TRUE
 [8,]  8 2 TRUE
 [9,]  9 1 TRUE
[10,] 10 2 TRUE


Why isn't z 5 like assigned?  I think it is because I assigned it as
NA, and data table didn't know to change it to integer (although why
it changed it to logical is another puzzle).  If I instead do

DT$z <- 0

DT[, z:=5]

It works fine.

So my two points are:

A) Doing DT[,z:=5] should be as informative as doing DT[1:nrow(DT),
z:=5] with the error message.

B) What went wrong with the NA assignment I did?

Thanks!
Chris


More information about the datatable-help mailing list