From ripley at stats.ox.ac.uk  Sat Sep  2 18:41:24 2006
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Sat, 2 Sep 2006 17:41:24 +0100 (BST)
Subject: [Rd] [<-.POSIXlt changes order of attributes (PR#9197)
In-Reply-To: <Pine.LNX.4.64.0609011416490.11719@gannet.stats.ox.ac.uk>
References: <20060901115839.3758019A05@slim.kubism.ku.dk>
	<Pine.LNX.4.64.0609011416490.11719@gannet.stats.ox.ac.uk>
Message-ID: <Pine.LNX.4.64.0609021738120.11327@gannet.stats.ox.ac.uk>

There is a bug in identical(), though:

> identical(pairlist(a=1, b=2), pairlist(a=1, aa=2))
[1] TRUE
> identical(structure(pi, a=1, b=2), structure(pi,a=1, aa=2))
[1] TRUE

so identical() is not even looking at the names of the attributes but only 
checking their values.  Oops ....

On Fri, 1 Sep 2006, Prof Brian Ripley wrote:

> Please point us to the documentation that says attributes are ordered.
> E.g. R-lang.texi says
> 
>   All objects except @code{NULL} can have one or more attributes attached
>   to them.  Attributes are stored as a list where all elements are named.
> 
> (although in fact they are stored in a pairlist).
> 
> I know of tens of functions that change the order of attributes, and 
> did look at teaching identical() that they are not ordered.  But 
> since they are stored as a pairlist, it would be quite expensive.
> (Given that attributes seem to be growing in use, another internal storage 
> mechanism is becoming more appropriate.)
> 
> BTW, all.equal() does not assume attributes are ordered.
> 
> 
> On Fri, 1 Sep 2006, gregor.gorjanc at bfro.uni-lj.si wrote:
> 
> > This is a multi-part message in MIME format.
> > --------------090203020600020104020707
> > Content-Type: text/plain; charset=UTF-8
> > Content-Transfer-Encoding: 7bit
> > 
> > Hello!
> > 
> > I was doing some tests with identical() and found out that [<-.POSIXlt
> > method changes order of attributes. This example shows that:
> > 
> > x <- strptime("1900-1-1", format="%Y-%m-%d")
> > x <- c(x)
> > y <- c(x, x+1)
> > x1 <- x
> > y1 <- y
> > 
> > attributes(x)
> > $names
> > [1] "sec"   "min"   "hour"  "mday"  "mon"   "year"  "wday"  "yday"  "isdst"
> > 
> > $class
> > [1] "POSIXt"  "POSIXlt"
> > 
> > $tzone
> > [1] ""     "CET"  "CEST"
> > 
> > identical(attributes(x), attributes(y))
> > TRUE
> > 
> > x[1] <- NA
> > attributes(x)
> > $names
> > [1] "sec"   "min"   "hour"  "mday"  "mon"   "year"  "wday"  "yday"  "isdst"
> > 
> > $tzone
> > [1] ""     "CET"  "CEST"
> > 
> > $class
> > [1] "POSIXt"  "POSIXlt"
> > 
> > y[1] <- NA
> > attributes(y)
> > $names
> > [1] "sec"   "min"   "hour"  "mday"  "mon"   "year"  "wday"  "yday"  "isdst"
> > 
> > $tzone
> > [1] ""     "CET"  "CEST"
> > 
> > $class
> > [1] "POSIXt"  "POSIXlt"
> > 
> > identical(attributes(x), attributes(x1))
> > FALSE
> > 
> > identical(attributes(y), attributes(y1))
> > FALSE
> > 
> > This can be solved with either:
> > 
> > Index: R/src/library/base/R/datetime.R
> > ===================================================================
> > --- R/src/library/base/R/datetime.R     (revision 39045)
> > +++ R/src/library/base/R/datetime.R     (working copy)
> > @@ -713,10 +713,10 @@
> >  {
> >      if(!as.logical(length(value))) return(x)
> >      value <- as.POSIXlt(value)
> > -    cl <- oldClass(x)
> > +    att <- attributes(x)
> >      class(x) <- class(value) <- NULL
> >      for(n in names(x)) x[[n]][i] <- value[[n]]
> > -    class(x) <- cl
> > +    attributes(x) <- att
> >      x
> >  }
> > 
> > or in the same way as it is done in [.<-POSIXct method
> > 
> > Index: R/src/library/base/R/datetime.R
> > ===================================================================
> > --- R/src/library/base/R/datetime.R     (revision 39045)
> > +++ R/src/library/base/R/datetime.R     (working copy)
> > @@ -714,9 +714,11 @@
> >      if(!as.logical(length(value))) return(x)
> >      value <- as.POSIXlt(value)
> >      cl <- oldClass(x)
> > +    tz <- attr(x, "tzone")
> >      class(x) <- class(value) <- NULL
> >      for(n in names(x)) x[[n]][i] <- value[[n]]
> >      class(x) <- cl
> > +    attr(x, "tzone") <- tz
> >      x
> >  }
> > 
> > I have checked both versions in r-devel with make check-all and all went
> > fine.
> > 
> > Regards, Gregor
> > 
> > 
> > 
> 
> 

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595




[Rd] [<-.POSIXlt changes order of attributes (PR#9197)
Prof Brian Ripley