You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Allow type override in := when i is just order() #2925
DT = data.table(a = 1:10)
DT[order(-a), a := paste0(a)]
This errors saying we should be explicit about type overrides, but:
DT[ , a := paste0(a)]
This code works fine (and is of course identical, but the same problem arises when the column update is order-dependent). Presumably this is because when i is non-empty, := suspects there could be a type collision if assigning a new type to a subset of rows.
But order queries in i are incapable of subsetting, so I would expect the behavior to be identical.
Now, try to convert a to factor, with levels generated in reverse-b order:
DT[order(-b), a := factor(a, levels = unique(a))]
Actually, nothing is done -- because a is a character, and we're trying to assign factor->character, [ "smartly" coerces factor->character, resulting in no change at all (PS this is not at all clear from the verbose output, which could be improved -- I was totally at sea until I tried an example where a starts out as integer, then the := fails because it tries to assign integer->character, an error).
As a workaround I'm basically forced to create a placeholder variable like a_factor or something like that
Activity
MichaelChirico commentedon Oct 7, 2021
I got bit by this again.
Here seems like perfectly reasonable code to me:
Now, try to convert
ato factor, with levels generated in reverse-border:Actually, nothing is done -- because
ais acharacter, and we're trying to assignfactor->character,["smartly" coerces factor->character, resulting in no change at all (PS this is not at all clear from the verbose output, which could be improved -- I was totally at sea until I tried an example whereastarts out asinteger, then the:=fails because it tries to assigninteger->character, an error).As a workaround I'm basically forced to create a placeholder variable like
a_factoror something like thatMichaelChirico commentedon Sep 5, 2024
IINM one workaround is to use
sort_by()for now: