In fact it all comes back to 'rank', which uses 'order(x[!nas])' internally. Surprisingly one does not get an infinite recursion: rank -> order -> xtfrm -> rank -> ...
This is obviously only one of possible outcomes, yet it seems to be happening. Previous implementation of order did not have a reference to xtfrm and thus would not cause this infinite loop Dr Oleg Sklyar Research Technologist AHL / Man Investments Ltd +44 (0)20 7144 3107 [EMAIL PROTECTED] > -----Original Message----- > From: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED] On Behalf Of Sklyar, > Oleg (London) > Sent: 09 September 2008 15:49 > To: John Chambers > Cc: R-devel@r-project.org > Subject: Re: [Rd] 'xtfrm' performance (influences 'order' > performance) in R devel > > Ha, defined xtfrm for TimeDate, works instantly (xtfrm is already a > method). However, it won't be taken up by order as it is not in the > imported namespace, so order falls back to xtfrm.default. > > Moreover, defining order (which is not a method unfortunately, *any > chance of changing this*?): > > setGeneric("order") > setMethod("order", "TimeDate", > function (..., na.last = TRUE, decreasing = FALSE) > order(list(...)[EMAIL PROTECTED],na.last=na.last, > decreasing=decreasing)) > > does not help either as it won't be taken up, order still calls the > default one, what am I doing wrong? > > > > Dr Oleg Sklyar > Research Technologist > AHL / Man Investments Ltd > +44 (0)20 7144 3107 > [EMAIL PROTECTED] > > > -----Original Message----- > > From: John Chambers [mailto:[EMAIL PROTECTED] > > Sent: 09 September 2008 15:11 > > To: Sklyar, Oleg (London) > > Cc: R-devel@r-project.org > > Subject: Re: [Rd] 'xtfrm' performance (influences 'order' > > performance) in R devel > > > > No definitive answers, but here are a few observations. > > > > In the call to order() code, I notice that you have dropped > > into the branch > > if (any(unlist(lapply(z, is.object)))) > > where the alternative in your case would seem to have been > > going directly to the internal code. > > > > You can consider a method for xtfrm(), which would help but > > won't get you completely back to a trivial computation. > > Alternatively, order() should be eligible for the new > > mechanism of defining methods for "...". > > > > (Individual existing methods may not be the issue, and one > > can't infer anything definite from the evidence given, but a > > plausible culprit is the "[" method. Because [] expressions > > appear so often, it's always chancy to define a nontrivial > > method for this function.) > > > > John > > > > Sklyar, Oleg (London) wrote: > > > > Hello everybody, > > > > it looks like the presense of some (do know know which) > > S4 methods for a > > given S4 class degrades the performance of xtfrm (used > > in 'order' in new > > R-devel) by a factor of millions. This is for classes > > that ARE derived > > from numeric directly and thus should be quite trivial > > to convert to > > numeric. > > > > Consider the following example: > > > > setClass("TimeDateBase", > > representation("numeric", mode="character"), > > prototype(mode="posix") > > ) > > setClass("TimeDate", > > representation("TimeDateBase", tzone="character"), > > prototype(tzone="London") > > ) > > x = new("TimeDate", 1220966224 + runif(1e5)) > > > > system.time({ z = order(x) }) > > ## > system.time({ z = order(x) }) > > ## user system elapsed > > ## 0.048 0.000 0.048 > > > > getClass("TimeDate") > > ## Class "TimeDate" > > > > ## Slots: > > > > ## Name: .Data tzone mode > > ## Class: numeric character character > > > > ## Extends: > > ## Class "TimeDateBase", directly > > ## Class "numeric", by class "TimeDateBase", distance 2 > > ## Class "vector", by class "TimeDateBase", distance 3 > > > > > > Now, if I load a library that not only defines these > > same classes, but > > also a bunch of methods for those, then I have the > > following result: > > > > library(AHLCalendar) > > x = now() + runif(1e5) ## just random times in POSIXct format > > x[1:5] > > ## TimeDate [posix] object in 'Europe/London' of length 5: > > ## [1] "2008-09-09 14:19:35.218" "2008-09-09 14:19:35.672" > > ## [3] "2008-09-09 14:19:35.515" "2008-09-09 14:19:35.721" > > ## [5] "2008-09-09 14:19:35.657" > > > > > > > > system.time({ z = order(x) }) > > > > > > > > > > Enter a frame number, or 0 to exit > > > > 1: system.time({ > > 2: order(x) > > 3: lapply(z, function(x) if (is.object(x)) xtfrm(x) else x) > > 4: FUN(X[[1]], ...) > > 5: xtfrm(x) > > 6: xtfrm.default(x) > > 7: as.vector(rank(x, ties.method = "min", na.last = "keep")) > > 8: rank(x, ties.method = "min", na.last = "keep") > > 9: switch(ties.method, average = , min = , max = > > .Internal(rank(x[!nas], ties. > > 10: .gt(c(1220966375.21811, 1220966375.67217, 1220966375.51470, > > 1220966375.7211 > > 11: x[j] > > 12: x[j] > > > > Selection: 0 > > Timing stopped at: 47.618 13.791 66.478 > > > > At the same time: > > > > system.time({ z = as.numeric(x) }) ## same as [EMAIL PROTECTED] > > ## user system elapsed > > ## 0.001 0.000 0.001 > > > > The only difference between the two is that I have the > > following methods > > defined for TimeDate (full listing below). > > > > Any idea why this could be happenning. And yes, it is > > down to xtfrm > > function, 'order' was just a place where the problem > > occured. Should > > xtfrm function be smarter with respect to classes that > > are actually > > derived from 'numeric'? > > > > > > > > showMethods(class="TimeDate") > > > > > > Function: + (package base) > > e1="TimeDate", e2="TimeDate" > > e1="TimeDate", e2="numeric" > > (inherited from: e1="TimeDateBase", e2="numeric") > > > > Function: - (package base) > > e1="TimeDate", e2="TimeDate" > > > > Function: Time (package AHLCalendar) > > x="TimeDate" > > > > Function: TimeDate (package AHLCalendar) > > x="TimeDate" > > > > Function: TimeDate<- (package AHLCalendar) > > x="TimeSeries", value="TimeDate" > > > > Function: TimeSeries (package AHLCalendar) > > x="data.frame", ts="TimeDate" > > x="matrix", ts="TimeDate" > > x="numeric", ts="TimeDate" > > > > Function: [ (package base) > > x="TimeDate", i="POSIXt", j="missing" > > x="TimeDate", i="Time", j="missing" > > x="TimeDate", i="TimeDate", j="missing" > > x="TimeDate", i="integer", j="missing" > > (inherited from: x="TimeDateBase", i="ANY", j="missing") > > x="TimeDate", i="logical", j="missing" > > (inherited from: x="TimeDateBase", i="ANY", j="missing") > > x="TimeSeries", i="TimeDate", j="missing" > > x="TimeSeries", i="TimeDate", j="vector" > > > > Function: [<- (package base) > > x="TimeDate", i="ANY", j="ANY", value="ANY" > > x="TimeDate", i="ANY", j="ANY", value="numeric" > > x="TimeDate", i="missing", j="ANY", value="ANY" > > x="TimeDate", i="missing", j="ANY", value="numeric" > > > > Function: add (package AHLCalendar) > > x="TimeDate" > > > > Function: addMonths (package AHLCalendar) > > x="TimeDate" > > > > Function: addYears (package AHLCalendar) > > x="TimeDate" > > > > Function: align (package AHLCalendar) > > x="TimeDate", to="character" > > x="TimeDate", to="missing" > > > > Function: as.POSIXct (package base) > > x="TimeDate" > > > > Function: as.POSIXlt (package base) > > x="TimeDate" > > > > Function: coerce (package methods) > > from="TimeDate", to="TimeDateBase" > > > > Function: coerce<- (package methods) > > from="TimeDate", to="numeric" > > > > Function: dates (package AHLCalendar) > > x="TimeDate" > > > > Function: format (package base) > > x="TimeDate" > > > > Function: fxFwdDate (package AHLCalendar) > > x="TimeDate", country="character" > > > > Function: fxSettleDate (package AHLCalendar) > > x="TimeDate", country="character" > > > > Function: holidays (package AHLCalendar) > > x="TimeDate" > > > > Function: index (package AHLCalendar) > > x="TimeDate", y="POSIXt" > > x="TimeDate", y="Time" > > x="TimeDate", y="TimeDate" > > > > Function: initialize (package methods) > > .Object="TimeDate" > > (inherited from: .Object="ANY") > > > > Function: leapYear (package AHLCalendar) > > x="TimeDate" > > > > Function: mday (package AHLCalendar) > > x="TimeDate" > > > > Function: mode (package base) > > x="TimeDate" > > (inherited from: x="TimeDateBase") > > > > Function: mode<- (package base) > > x="TimeDate", value="character" > > (inherited from: x="TimeDateBase", value="character") > > > > Function: month (package AHLCalendar) > > x="TimeDate" > > > > Function: pretty (package base) > > x="TimeDate" > > > > Function: prettyFormat (package AHLCalendar) > > x="TimeDate", munit="character" > > x="TimeDate", munit="missing" > > > > Function: print (package base) > > x="TimeDate" > > > > Function: show (package methods) > > object="TimeDate" > > (inherited from: object="TimeDateBase") > > > > Function: summary (package base) > > object="TimeDate" > > > > Function: td2tz (package AHLCalendar) > > x="TimeDate" > > > > Function: times (package AHLCalendar) > > x="TimeDate" > > > > Function: tojulian (package AHLCalendar) > > x="TimeDate" > > > > Function: toposix (package AHLCalendar) > > x="TimeDate" > > > > Function: tots (package AHLCalendar) > > x="TimeDate" > > > > Function: tzone (package AHLCalendar) > > x="TimeDate" > > > > Function: tzone<- (package AHLCalendar) > > x="TimeDate" > > > > Function: wday (package AHLCalendar) > > x="TimeDate" > > > > Function: yday (package AHLCalendar) > > x="TimeDate" > > > > Function: year (package AHLCalendar) > > x="TimeDate" > > > > > > > > Dr Oleg Sklyar > > Research Technologist > > AHL / Man Investments Ltd > > +44 (0)20 7144 3107 > > [EMAIL PROTECTED] > > > > > > > > > ********************************************************************** > > The contents of this email are for the named > > addressee(s...{{dropped:22}} > > > > ______________________________________________ > > R-devel@r-project.org mailing list > > https://stat.ethz.ch/mailman/listinfo/r-devel > > > > > > > > > > > ********************************************************************** > The contents of this email are for the named > addressee(s...{{dropped:22}} > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > ********************************************************************** The contents of this email are for the named addressee(s...{{dropped:22}} ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel