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

Chris Neff caneff at gmail.com
Thu Aug 4 14:18:19 CEST 2011


A second question while I'm playing with it. It seems from the FRs
that it doesn't support multiple := in one select, but:

DT <- data.table(x=1:10, y=rep(1:2,10))
DT$a = 0
DT$z = 0

DT[, list(a := y/sum(y), z := 5)]

works just fine for me.  An error gets thrown but afterwards the
columns are modified as intended. Why the error?

> DT[,list(z:=5,a:=y/sum(y))]
z
[1] 5
[1] TRUE
a
y/sum(y)
[1] TRUE
Error in data.table(`:=`(z, 5), `:=`(a, y/sum(y))) :
  column or argument 1 is NULL
> DT
       x y z          a
 [1,]  1 1 5 0.06666667
 [2,]  2 2 5 0.13333333
 [3,]  3 1 5 0.06666667
 [4,]  4 2 5 0.13333333
 [5,]  5 1 5 0.06666667
 [6,]  6 2 5 0.13333333
 [7,]  7 1 5 0.06666667
 [8,]  8 2 5 0.13333333
 [9,]  9 1 5 0.06666667
[10,] 10 2 5 0.13333333

-Chris

On 4 August 2011 08:12, Chris Neff <caneff at gmail.com> wrote:
> 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