[Rd] sort changes datatype of operand (PR#9121)

Ponzio, Stephen [CIB-LAVA] stephen.ponzio at citigroup.com
Thu Aug 3 17:37:26 CEST 2006


Is this a desirable change?

I would have expected sort to be equivalent to using order.

Thanks,
Stephen


-----Original Message-----
From: Duncan Murdoch [mailto:murdoch at stats.uwo.ca]
Sent: Thursday, August 03, 2006 11:33 AM
To: Ponzio, Stephen [CIB-LAVA]
Cc: r-devel at stat.math.ethz.ch; R-bugs at biostat.ku.dk
Subject: Re: [Rd] sort changes datatype of operand (PR#9121)


On 8/3/2006 10:34 AM, stephen.ponzio at citigroup.com wrote:
> Full_Name: Stephen Ponzio
> Version: 2.3.1
> OS: Windows
> Submission from: (NULL) (199.67.138.42)
> 
> 
> Given a vector of dates, sort returns a vector of numerics instead of dates.
> This is different from the behavior in version 2.2, where dates were returned.
> In this respect, sort is not equivalent to order.
> 
>> dates <- seq(Sys.Date(), len=5, by="1 day")
> 
>> dates[order(dates)]
> [1] "2006-08-03" "2006-08-04" "2006-08-05" "2006-08-06" "2006-08-07"
>> sort(dates)
> [1] 13363 13364 13365 13366 13367
> 
>> class(dates[order(dates)])
> [1] "Date"
>> class(sort(dates))
> [1] "numeric"


This is not a bug, it's documented behaviour in ?sort:

> 
>      As from R 2.3.0, all attributes are removed from the return value
>      except names, which are sorted.  (If 'partial' is specified even
>      the names are removed.)  Note that this means that the returned
>      value has no class, except for factors and ordered factors (which
>      are treated specially and whose result is transformed back to the
>      original class).


The problem is that some classes assume a particular ordering for 
values; sort can mess them up.  If you know that's not the case, you can 
protect the class yourself:

cl <- class(dates)
sorteddates <- sort(dates)
class(sorteddates) <- cl

You could put this into your own sort.Date function, but it won't be 
called automatically:  sort is not a generic.

  sort.Date <- function(x) {
  cl <- class(x)
  structure(sort(x), class=cl)
  }

Duncan Murdoch



More information about the R-devel mailing list