Sklyar, Oleg (London) wrote:
> 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.
>   
By "method" you mean "generic"?  xtfrm is an S3 generic.  I'm not clear 
what happens if you define an S3 method for it.  Yes, there is a problem 
defining an S4 generic & it would be good to deal with that.  
Nontrivial, however.
> 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?
>   
I'm skeptical that this is true.  I did a simple example:

 > setClass("foo", contains = "numeric", representation(flag = "logical"))
[1] "foo"
 > xx = new("foo", rnorm(5))
 > setGeneric("order", sig = "...")
Creating a generic for "order" in package  ".GlobalEnv"
    (the supplied definition differs from and overrides the implicit 
generic in package "base": Signatures differ:  (...), (na.last, decreasing))
[1] "order"
 > setMethod("order", "foo", function (..., na.last = TRUE, decreasing = 
FALSE){message("Method called"); order([EMAIL PROTECTED])})
[1] "order"
 > order(xx)
Method called
[1] 2 4 3 1 5

You do need to be calling order() directly from one of your functions, 
and have it in your namespace, if your package has one.
>
>
> 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
>
>   

        [[alternative HTML version deleted]]

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to