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, [EMAIL PROTECTED] 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, [EMAIL PROTECTED] 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 ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel