[datatable-help] =?utf-8?Q?=60with=3DF=60_?=in the `i` Argument

Arunkumar Srinivasan aragorn168b at gmail.com
Fri Jun 20 23:47:20 CEST 2014


This is a really tricky one. I was just trying to fix it when I recollected the issues with base:::order from the time during implementation.

Consider this case:

require(data.table)
DT <- data.table(x=c(1,4,3,2), y=c(8,6,5,7), z=c(10,12,11,9))
Consider the cases A and B below:

# case A
DT[base:::order(DT[, "x", with=FALSE])]
#    x y  z
# 1: 1 8 10
# 2: 2 7  9
# 3: 3 5 11
# 4: 4 6 12
Intended right result. Great!

B:

# case B
DT[base:::order(list(x))]
#    x y  z
# 1: 1 8 10
What just happened?!? So, basically if the list gives TRUE for is.object(.), it understands what the opeation is, correctly. But if it’s just a list, no idea how to deal with it. Also it silently returns undesirable result (imo).

Similar to the above cases, compare these two:

# case C
DT[base:::order(DT[, "x", with=FALSE], DT[, "y", with=FALSE])]
# vs
# case D
DT[base:::order(list(x), list(y))]
Even more crazy case:

# case E
DT[base:::order(DT[, c("x", "y"), with=FALSE])]
# vs
# case F
DT[base:::order(list(x,y))]
While we were testing and implementing forder, obviously it dint occur to check with the argument to order(.) with a data.table. And in spite of the fact that the output for DT[order(list(x))] is a bit strange and even dangerous, to be consistent with base:::order, we had implemented it the same way.

Now, I’m not so sure.. Any ideas justifying these differences?



Arun

From: Michael Smith my.r.help at gmail.com
Reply: Michael Smith my.r.help at gmail.com
Date: June 15, 2014 at 5:02:46 AM
To: G See gsee000 at gmail.com
Cc: datatable-help at lists.r-forge.r-project.org datatable-help at lists.r-forge.r-project.org
Subject:  Re: [datatable-help] `with=F` in the `i` Argument  

Devs,  

Is this a bug? It works in 1.9.2 but not in the 1.9.3 development version:  

DT <- data.table(a = 1:4, b = 8:5)  
for (i in c("a", "b"))  
print(DT[order(DT[, i, with = FALSE])])  

Error in forder(DT, DT[, i, with = FALSE]) :  
Column '1' is type 'list' which is not supported for ordering currently.  


Thanks,  

M  


On 05/31/2014 12:44 PM, G See wrote:  
> Hi Michael,  
>  
> I would use get()  
>  
> DT <- data.table(a = 1:4, b = 8:5)  
> for (i in c("a", "b"))  
> print(DT[order(get(i))])  
>  
> For what it's worth, your solution doesn't seem to work in data.table  
> 1.9.3 (svn rev. 1278):  
>  
>> for (i in c("a", "b"))  
> + print(DT[order(DT[, i, with = FALSE])])  
> Error in forder(DT, DT[, i, with = FALSE]) :  
> Column '1' is type 'list' which is not supported for ordering currently.  
>  
>  
> HTH,  
> Garrett  
>  
> On Fri, May 30, 2014 at 11:01 PM, Michael Smith <my.r.help at gmail.com> wrote:  
>> All,  
>>  
>> I'm trying to order the rows according to several columns at a time:  
>>  
>> DT <- data.table(a = 1:4, b = 8:5)  
>> for (i in c("a", "b"))  
>> print(DT[order(i), with = FALSE])  
>>  
>> It doesn't work, since `with` seems to be about the `j` argument, but  
>> not the `i` argument, according to `?data.table`.  
>>  
>> I found the following workaround, but wonder whether there is a more  
>> elegant way to do it:  
>>  
>> for (i in c("a", "b"))  
>> print(DT[order(DT[, i, with = FALSE])])  
>>  
>> Thanks,  
>> M  
>> _______________________________________________  
>> datatable-help mailing list  
>> datatable-help at lists.r-forge.r-project.org  
>> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/datatable-help  
_______________________________________________  
datatable-help mailing list  
datatable-help at lists.r-forge.r-project.org  
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/datatable-help  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/datatable-help/attachments/20140620/ec73380a/attachment-0001.html>


More information about the datatable-help mailing list