Re: [Rd] graphics::Axis loosing S3/S4 class attributes of 'x' in 2.7.0 RC

2008-04-22 Thread Duncan Murdoch
On 22/04/2008 7:25 AM, Sklyar, Oleg (MI London) wrote:
 Following my previous post on S3 method despatch, I put debug messages
 in the code of Axis, Axis.default and plot.default in graphics/R/axis.R
 and graphics/R/plot.R to print the class of x, at and y on plot. After
 recompiling R, what I see is that x *lost* its class attribute (at least
 for classes not known to 'graphics') in Axis, called directly from
 plot.default and this could be the reason why R did not despatch on
 Axis.MyClass from my previous post. This happens for both S3 and S4
 classes as in the code below! Funny enough, even integer was reset to
 numeric in Axis...

If you look at plot.default, you'll see it passes x and y through 
xy.coords to get coordinates.  That function ends with

return(list(x=as.double(x), y=as.double(y), xlab=xlab, ylab=ylab))

so that's where classes get removed.  If you don't want this to happen, 
shouldn't you be defining plot.MyClass, or calling the default with 
axes=F, and then calling Axis on your object yourself?

 Is this really an intended behaviour? It looks very wrong to me!

This is documented:  ?plot.default tells you to look at ?xy.coords for 
details of how x and y are handled, and xy.coords
says In any other case, the 'x' argument is coerced to a vector and
  returned as *y* component where the resulting 'x' is just the
  index vector '1:n'.  In this case, the resulting 'xlab' component
  is set to 'Index'.

Duncan Murdoch

 Thanks,
 Oleg
 
 *** R version 2.7.0 RC (2008-04-20 r45403) [/research/osklyar/R-devel]
 ***
 Axis
 function (x = NULL, at = NULL, ..., side, labels = NULL)
 {
 cat(In Axis() class(x)=, class(x), ; class(at)=, class(at),
 \n, sep = )
 if (!is.null(x))
 UseMethod(Axis, x)
 else if (!is.null(at))
 UseMethod(Axis, at)
 else axis(side = side, at = at, labels = labels, ...)
 }
 environment: namespace:graphics
 graphics:::Axis.default
 function (x = NULL, at = NULL, ..., side, labels = NULL)
 {
 cat(In Axis.default() class(x)=, class(x), ; class(at)=,
 class(at), \n, sep = )
 if (is.null(at)  !is.null(x))
 at = pretty(x)
 axis(side = side, at = at, labels = labels, ...)
 }
 environment: namespace:graphics
 setClass(MyClass, representation(smth=character),
 contains=numeric)
 [1] MyClass
 a = new(MyClass, runif(10))
 a
 An object of class MyClass
  [1] 0.773237167 0.548630205 0.987956687 0.212667925 0.337135151
 0.112210501
  [7] 0.007140895 0.972028903 0.443581963 0.536452424
 Slot smth:
 character(0)
 plot(1:10,a)
 In plot.default() class(x)=integer; class(y)=MyClass
 In Axis() class(x)=numeric; class(at)=NULL
 In Axis.default() class(x)=numeric; class(at)=NULL
 In Axis() class(x)=numeric; class(at)=NULL
 In Axis.default() class(x)=numeric; class(at)=NULL
 plot(a,1:10)
 In plot.default() class(x)=MyClass; class(y)=integer
 In Axis() class(x)=numeric; class(at)=NULL
 In Axis.default() class(x)=numeric; class(at)=NULL
 In Axis() class(x)=numeric; class(at)=NULL
 In Axis.default() class(x)=numeric; class(at)=NULL
 b = runif(10)
 class(b)=AnotherClass
 plot(b,1:10)
 In plot.default() class(x)=AnotherClass; class(y)=integer
 In Axis() class(x)=numeric; class(at)=NULL
 In Axis.default() class(x)=numeric; class(at)=NULL
 In Axis() class(x)=numeric; class(at)=NULL
 In Axis.default() class(x)=numeric; class(at)=NULL
 plot(1:10)
 In plot.default() class(x)=integer; class(y)=NULL
 In Axis() class(x)=numeric; class(at)=NULL
 In Axis.default() class(x)=numeric; class(at)=NULL
 In Axis() class(x)=numeric; class(at)=NULL
 In Axis.default() class(x)=numeric; class(at)=NULL
 sessionInfo()
 R version 2.7.0 RC (2008-04-20 r45403)
 x86_64-unknown-linux-gnu
 
 locale:
 LC_CTYPE=en_GB.UTF-8;LC_NUMERIC=C;LC_TIME=en_GB.UTF-8;LC_COLLATE=C;LC_MO
 NETARY=C;LC_MESSAGES=en_GB.UTF-8;LC_PAPER=en_GB.UTF-8;LC_NAME=C;LC_ADDRE
 SS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_GB.UTF-8;LC_IDENTIFICATION=C
 
 attached base packages:
 [1] stats graphics  grDevices utils datasets  methods   base
 
 
 Dr Oleg Sklyar
 Technology Group
 Man Investments Ltd
 +44 (0)20 7144 3803
 [EMAIL PROTECTED]
 
 
 **
 The contents of this email are for the named addressee(s) only.
 It contains information which may be confidential and privileged.
 If you are not the intended recipient, please notify the sender
 immediately, destroy this email and any attachments and do not
 otherwise disclose or use them. Email transmission is not a
 secure method of communication and Man Investments cannot accept
 responsibility for the completeness or accuracy of this email or
 any attachments. Whilst Man Investments makes every effort to keep
 its network free from viruses, it does not accept responsibility
 for any computer virus which might be transferred by way of this
 email or any attachments. This email does not constitute a request,
 offer, recommendation or solicitation of any kind to buy, 

Re: [Rd] graphics::Axis loosing S3/S4 class attributes of 'x' in 2.7.0 RC

2008-04-22 Thread Sklyar, Oleg (MI London)
Duncan,

looking further, what has changed from 2.6.2 into 2.7.0 are the
following two lines in plot.default, which I think were logical before
and are not really logical now:

plot.R: plot.default (2.6.2):
if (axes) {
localAxis(x, side=1, ...)
localAxis(y, side=2, ...)
}

plot.R: plot.default (2.7.0):
...
if (axes) {
localAxis(xy$x, side=1, ...)
localAxis(xy$y, side=2, ...)
}

The fact that xy.coords is called does not really matter.


Dr Oleg Sklyar
Technology Group
Man Investments Ltd
+44 (0)20 7144 3803
[EMAIL PROTECTED] 

 -Original Message-
 From: Duncan Murdoch [mailto:[EMAIL PROTECTED] 
 Sent: 22 April 2008 13:01
 To: Sklyar, Oleg (MI London)
 Cc: R-devel@r-project.org
 Subject: Re: [Rd] graphics::Axis loosing S3/S4 class 
 attributes of 'x' in 2.7.0 RC
 
 On 22/04/2008 7:25 AM, Sklyar, Oleg (MI London) wrote:
  Following my previous post on S3 method despatch, I put 
 debug messages 
  in the code of Axis, Axis.default and plot.default in 
  graphics/R/axis.R and graphics/R/plot.R to print the class of x, at 
  and y on plot. After recompiling R, what I see is that x *lost* its 
  class attribute (at least for classes not known to 'graphics') in 
  Axis, called directly from plot.default and this could be 
 the reason 
  why R did not despatch on Axis.MyClass from my previous post. This 
  happens for both S3 and S4 classes as in the code below! 
 Funny enough, 
  even integer was reset to numeric in Axis...
 
 If you look at plot.default, you'll see it passes x and y 
 through xy.coords to get coordinates.  That function ends with
 
 return(list(x=as.double(x), y=as.double(y), xlab=xlab, ylab=ylab))
 
 so that's where classes get removed.  If you don't want this 
 to happen, shouldn't you be defining plot.MyClass, or calling 
 the default with axes=F, and then calling Axis on your object 
 yourself?
 
  Is this really an intended behaviour? It looks very wrong to me!
 
 This is documented:  ?plot.default tells you to look at 
 ?xy.coords for details of how x and y are handled, and 
 xy.coords says In any other case, the 'x' argument is 
 coerced to a vector and
   returned as *y* component where the resulting 'x' is just the
   index vector '1:n'.  In this case, the resulting 'xlab' 
 component
   is set to 'Index'.
 
 Duncan Murdoch
 
  Thanks,
  Oleg
  
  *** R version 2.7.0 RC (2008-04-20 r45403) 
 [/research/osklyar/R-devel]
  ***
  Axis
  function (x = NULL, at = NULL, ..., side, labels = NULL) {
  cat(In Axis() class(x)=, class(x), ; class(at)=, class(at),
  \n, sep = )
  if (!is.null(x))
  UseMethod(Axis, x)
  else if (!is.null(at))
  UseMethod(Axis, at)
  else axis(side = side, at = at, labels = labels, ...) }
  environment: namespace:graphics
  graphics:::Axis.default
  function (x = NULL, at = NULL, ..., side, labels = NULL) {
  cat(In Axis.default() class(x)=, class(x), ; class(at)=,
  class(at), \n, sep = )
  if (is.null(at)  !is.null(x))
  at = pretty(x)
  axis(side = side, at = at, labels = labels, ...) }
  environment: namespace:graphics
  setClass(MyClass, representation(smth=character),
  contains=numeric)
  [1] MyClass
  a = new(MyClass, runif(10))
  a
  An object of class MyClass
   [1] 0.773237167 0.548630205 0.987956687 0.212667925 0.337135151
  0.112210501
   [7] 0.007140895 0.972028903 0.443581963 0.536452424 Slot smth:
  character(0)
  plot(1:10,a)
  In plot.default() class(x)=integer; class(y)=MyClass In Axis() 
  class(x)=numeric; class(at)=NULL In Axis.default() 
 class(x)=numeric; 
  class(at)=NULL In Axis() class(x)=numeric; class(at)=NULL In 
  Axis.default() class(x)=numeric; class(at)=NULL
  plot(a,1:10)
  In plot.default() class(x)=MyClass; class(y)=integer In Axis() 
  class(x)=numeric; class(at)=NULL In Axis.default() 
 class(x)=numeric; 
  class(at)=NULL In Axis() class(x)=numeric; class(at)=NULL In 
  Axis.default() class(x)=numeric; class(at)=NULL
  b = runif(10)
  class(b)=AnotherClass
  plot(b,1:10)
  In plot.default() class(x)=AnotherClass; class(y)=integer In Axis() 
  class(x)=numeric; class(at)=NULL In Axis.default() 
 class(x)=numeric; 
  class(at)=NULL In Axis() class(x)=numeric; class(at)=NULL In 
  Axis.default() class(x)=numeric; class(at)=NULL
  plot(1:10)
  In plot.default() class(x)=integer; class(y)=NULL In Axis() 
  class(x)=numeric; class(at)=NULL In Axis.default() 
 class(x)=numeric; 
  class(at)=NULL In Axis() class(x)=numeric; class(at)=NULL In 
  Axis.default() class(x)=numeric; class(at)=NULL
  sessionInfo()
  R version 2.7.0 RC (2008-04-20 r45403) x86_64-unknown-linux-gnu
  
  locale:
  
 LC_CTYPE=en_GB.UTF-8;LC_NUMERIC=C;LC_TIME=en_GB.UTF-8;LC_COLLATE=C;LC_
  MO 
  
 NETARY=C;LC_MESSAGES=en_GB.UTF-8;LC_PAPER=en_GB.UTF-8;LC_NAME=C;LC_ADD
  RE 
 SS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_GB.UTF-8;LC_IDENTIFICATION=C
  
  attached base packages:
  [1] stats graphics  grDevices utils datasets  methods   base

Re: [Rd] graphics::Axis loosing S3/S4 class attributes of 'x' in 2.7.0 RC

2008-04-22 Thread Gabor Grothendieck
This also affects Axis.yearmon and Axis.yearqtr in the
zoo package which worked in R 2.6.2 and now don't work
properly.   It seems more logical to define plot.whatever
to handle the object in question, i.e. we do define plot.zoo,
whereas only the Axis method ought to be required for the
X and Y coordinate axes.

On Tue, Apr 22, 2008 at 8:53 AM, Sklyar, Oleg (MI London)
[EMAIL PROTECTED] wrote:
 Thanks Duncan,

 this might explain why Axis.MyClass is never called.

 However, it is really not only illogical to define plot.MyClass instead
 of Axis.MyClass if the only thing I want is formatting of the axis, but
 it is also broken in R 2.7.0 and here is why.

 Let's forget about MyClass and take POSIXct, for which plot.POSIXct and
 Axis.POSIXct are defined in graphics. First question would be, why
 define Axis.POSIXct if it is logical to just define plot.POSIXct. But
 then, try the following example in 2.7.0 and 2.6.2:

 x = Sys.time() + runif(100,1,7200) ## time over two hours, POSIXct
 plot(x,1:100)
 plot(1:100,x)

 The first plot will be correctly formatted in both R versions while the
 second one will be *incorrectly* formatted in 2.7.0 (funny enough
 xy.coords returns as.double in both, so that might not be the reason for
 the problem).

 What happens is that plot.POSIXct is called in the former case and thus
 we get the correct formatting. However, plot.default is called in the
 latter case. In 2.6.2 Axis.POSIXct was the reason why y axis was
 correctly formatted here. In 2.7.0 Axis.default is called instead
 because class of x is reset.

 Now this perfectly indicates why it is logical to have Axis.MyClass
 defined (as this two-liner would be called in all possible situations
 producing correct axes independently where it is called from) and not
 plot.MyClass (which would actually not cover the situation of only the
 second argument being MyClass). Surely I can define S4 with multiple
 signatures, but logically I would define Axis.MyClass.

 Omitting axes completely is not a good options to enforce on users for
 default plots, is it?


 Dr Oleg Sklyar
 Technology Group
 Man Investments Ltd
 +44 (0)20 7144 3803
 [EMAIL PROTECTED]


  -Original Message-
  From: Duncan Murdoch [mailto:[EMAIL PROTECTED]
  Sent: 22 April 2008 13:01
  To: Sklyar, Oleg (MI London)
  Cc: R-devel@r-project.org
  Subject: Re: [Rd] graphics::Axis loosing S3/S4 class
  attributes of 'x' in 2.7.0 RC
 
  On 22/04/2008 7:25 AM, Sklyar, Oleg (MI London) wrote:
   Following my previous post on S3 method despatch, I put
  debug messages
   in the code of Axis, Axis.default and plot.default in
   graphics/R/axis.R and graphics/R/plot.R to print the class of x, at
   and y on plot. After recompiling R, what I see is that x *lost* its
   class attribute (at least for classes not known to 'graphics') in
   Axis, called directly from plot.default and this could be
  the reason
   why R did not despatch on Axis.MyClass from my previous post. This
   happens for both S3 and S4 classes as in the code below!
  Funny enough,
   even integer was reset to numeric in Axis...
 
  If you look at plot.default, you'll see it passes x and y
  through xy.coords to get coordinates.  That function ends with
 
  return(list(x=as.double(x), y=as.double(y), xlab=xlab, ylab=ylab))
 
  so that's where classes get removed.  If you don't want this
  to happen, shouldn't you be defining plot.MyClass, or calling
  the default with axes=F, and then calling Axis on your object
  yourself?
 
   Is this really an intended behaviour? It looks very wrong to me!
 
  This is documented:  ?plot.default tells you to look at
  ?xy.coords for details of how x and y are handled, and
  xy.coords says In any other case, the 'x' argument is
  coerced to a vector and
returned as *y* component where the resulting 'x' is just the
index vector '1:n'.  In this case, the resulting 'xlab'
  component
is set to 'Index'.
 
  Duncan Murdoch
 
   Thanks,
   Oleg
  
   *** R version 2.7.0 RC (2008-04-20 r45403)
  [/research/osklyar/R-devel]
   ***
   Axis
   function (x = NULL, at = NULL, ..., side, labels = NULL) {
   cat(In Axis() class(x)=, class(x), ; class(at)=, class(at),
   \n, sep = )
   if (!is.null(x))
   UseMethod(Axis, x)
   else if (!is.null(at))
   UseMethod(Axis, at)
   else axis(side = side, at = at, labels = labels, ...) }
   environment: namespace:graphics
   graphics:::Axis.default
   function (x = NULL, at = NULL, ..., side, labels = NULL) {
   cat(In Axis.default() class(x)=, class(x), ; class(at)=,
   class(at), \n, sep = )
   if (is.null(at)  !is.null(x))
   at = pretty(x)
   axis(side = side, at = at, labels = labels, ...) }
   environment: namespace:graphics
   setClass(MyClass, representation(smth=character),
   contains=numeric)
   [1] MyClass
   a = new(MyClass, runif(10))
   a
   An object of class MyClass
[1] 0.773237167 0.548630205 0.987956687 0.212667925

Re: [Rd] graphics::Axis loosing S3/S4 class attributes of 'x' in 2.7.0 RC

2008-04-22 Thread Sklyar, Oleg (MI London)
Lines 69/70 in plot.R of graphics:

xy$x and xy$y should have stayed as x and y

Dr Oleg Sklyar
Technology Group
Man Investments Ltd
+44 (0)20 7144 3803
[EMAIL PROTECTED] 

 -Original Message-
 From: Gabor Grothendieck [mailto:[EMAIL PROTECTED] 
 Sent: 22 April 2008 14:12
 To: Sklyar, Oleg (MI London)
 Cc: Duncan Murdoch; R-devel@r-project.org
 Subject: Re: [Rd] graphics::Axis loosing S3/S4 class 
 attributes of 'x' in 2.7.0 RC
 
 This also affects Axis.yearmon and Axis.yearqtr in the zoo 
 package which worked in R 2.6.2 and now don't work
 properly.   It seems more logical to define plot.whatever
 to handle the object in question, i.e. we do define plot.zoo, 
 whereas only the Axis method ought to be required for the X 
 and Y coordinate axes.
 
 On Tue, Apr 22, 2008 at 8:53 AM, Sklyar, Oleg (MI London) 
 [EMAIL PROTECTED] wrote:
  Thanks Duncan,
 
  this might explain why Axis.MyClass is never called.
 
  However, it is really not only illogical to define plot.MyClass 
  instead of Axis.MyClass if the only thing I want is 
 formatting of the 
  axis, but it is also broken in R 2.7.0 and here is why.
 
  Let's forget about MyClass and take POSIXct, for which plot.POSIXct 
  and Axis.POSIXct are defined in graphics. First question 
 would be, why 
  define Axis.POSIXct if it is logical to just define 
 plot.POSIXct. But 
  then, try the following example in 2.7.0 and 2.6.2:
 
  x = Sys.time() + runif(100,1,7200) ## time over two hours, POSIXct
  plot(x,1:100)
  plot(1:100,x)
 
  The first plot will be correctly formatted in both R versions while 
  the second one will be *incorrectly* formatted in 2.7.0 
 (funny enough 
  xy.coords returns as.double in both, so that might not be 
 the reason 
  for the problem).
 
  What happens is that plot.POSIXct is called in the former case and 
  thus we get the correct formatting. However, plot.default 
 is called in 
  the latter case. In 2.6.2 Axis.POSIXct was the reason why y 
 axis was 
  correctly formatted here. In 2.7.0 Axis.default is called instead 
  because class of x is reset.
 
  Now this perfectly indicates why it is logical to have Axis.MyClass 
  defined (as this two-liner would be called in all possible 
 situations 
  producing correct axes independently where it is called 
 from) and not 
  plot.MyClass (which would actually not cover the situation 
 of only the 
  second argument being MyClass). Surely I can define S4 with 
 multiple 
  signatures, but logically I would define Axis.MyClass.
 
  Omitting axes completely is not a good options to enforce 
 on users for 
  default plots, is it?
 
 
  Dr Oleg Sklyar
  Technology Group
  Man Investments Ltd
  +44 (0)20 7144 3803
  [EMAIL PROTECTED]
 
 
   -Original Message-
   From: Duncan Murdoch [mailto:[EMAIL PROTECTED]
   Sent: 22 April 2008 13:01
   To: Sklyar, Oleg (MI London)
   Cc: R-devel@r-project.org
   Subject: Re: [Rd] graphics::Axis loosing S3/S4 class 
 attributes of 
   'x' in 2.7.0 RC
  
   On 22/04/2008 7:25 AM, Sklyar, Oleg (MI London) wrote:
Following my previous post on S3 method despatch, I put
   debug messages
in the code of Axis, Axis.default and plot.default in 
graphics/R/axis.R and graphics/R/plot.R to print the 
 class of x, 
at and y on plot. After recompiling R, what I see is 
 that x *lost* 
its class attribute (at least for classes not known to 
 'graphics') 
in Axis, called directly from plot.default and this could be
   the reason
why R did not despatch on Axis.MyClass from my previous 
 post. This 
happens for both S3 and S4 classes as in the code below!
   Funny enough,
even integer was reset to numeric in Axis...
  
   If you look at plot.default, you'll see it passes x and y through 
   xy.coords to get coordinates.  That function ends with
  
   return(list(x=as.double(x), y=as.double(y), xlab=xlab, ylab=ylab))
  
   so that's where classes get removed.  If you don't want this to 
   happen, shouldn't you be defining plot.MyClass, or calling the 
   default with axes=F, and then calling Axis on your object 
 yourself?
  
Is this really an intended behaviour? It looks very wrong to me!
  
   This is documented:  ?plot.default tells you to look at 
 ?xy.coords 
   for details of how x and y are handled, and xy.coords 
 says In any 
   other case, the 'x' argument is coerced to a vector and
 returned as *y* component where the resulting 'x' 
 is just the
 index vector '1:n'.  In this case, the resulting 'xlab'
   component
 is set to 'Index'.
  
   Duncan Murdoch
  
Thanks,
Oleg
   
*** R version 2.7.0 RC (2008-04-20 r45403)
   [/research/osklyar/R-devel]
***
Axis
function (x = NULL, at = NULL, ..., side, labels = NULL) {
cat(In Axis() class(x)=, class(x), ; 
 class(at)=, class(at),
\n, sep = )
if (!is.null(x))
UseMethod(Axis, x)
else if (!is.null(at))
UseMethod(Axis, at)
else axis(side = side

Re: [Rd] graphics::Axis loosing S3/S4 class attributes of 'x' in 2.7.0 RC

2008-04-22 Thread Duncan Murdoch
On 4/22/2008 9:08 AM, Sklyar, Oleg (MI London) wrote:
 Duncan,
 
 looking further, what has changed from 2.6.2 into 2.7.0 are the
 following two lines in plot.default, which I think were logical before
 and are not really logical now:

I believe it is behaving as documented now, so the behaviour is 
logical, even if it may not be convenient.  In your example

x = Sys.time() + runif(100,1,7200) ## time over two hours, POSIXct
plot(x, 1:100)
plot(1:100, x)

the 1st works in 2.6.2 and 2.7.0 and the second only works in 2.6.2. 
But the change below was designed to fix the case

plot(x)

which works in 2.7.0 and *not* in 2.6.2, so reverting the change is not 
the way to address this.

Duncan Murdoch

 
 plot.R: plot.default (2.6.2):
 if (axes) {
   localAxis(x, side=1, ...)
   localAxis(y, side=2, ...)
 }
 
 plot.R: plot.default (2.7.0):
 ...
 if (axes) {
   localAxis(xy$x, side=1, ...)
   localAxis(xy$y, side=2, ...)
 }
 
 The fact that xy.coords is called does not really matter.
 
 
 Dr Oleg Sklyar
 Technology Group
 Man Investments Ltd
 +44 (0)20 7144 3803
 [EMAIL PROTECTED] 
 
 -Original Message-
 From: Duncan Murdoch [mailto:[EMAIL PROTECTED] 
 Sent: 22 April 2008 13:01
 To: Sklyar, Oleg (MI London)
 Cc: R-devel@r-project.org
 Subject: Re: [Rd] graphics::Axis loosing S3/S4 class 
 attributes of 'x' in 2.7.0 RC
 
 On 22/04/2008 7:25 AM, Sklyar, Oleg (MI London) wrote:
  Following my previous post on S3 method despatch, I put 
 debug messages 
  in the code of Axis, Axis.default and plot.default in 
  graphics/R/axis.R and graphics/R/plot.R to print the class of x, at 
  and y on plot. After recompiling R, what I see is that x *lost* its 
  class attribute (at least for classes not known to 'graphics') in 
  Axis, called directly from plot.default and this could be 
 the reason 
  why R did not despatch on Axis.MyClass from my previous post. This 
  happens for both S3 and S4 classes as in the code below! 
 Funny enough, 
  even integer was reset to numeric in Axis...
 
 If you look at plot.default, you'll see it passes x and y 
 through xy.coords to get coordinates.  That function ends with
 
 return(list(x=as.double(x), y=as.double(y), xlab=xlab, ylab=ylab))
 
 so that's where classes get removed.  If you don't want this 
 to happen, shouldn't you be defining plot.MyClass, or calling 
 the default with axes=F, and then calling Axis on your object 
 yourself?
 
  Is this really an intended behaviour? It looks very wrong to me!
 
 This is documented:  ?plot.default tells you to look at 
 ?xy.coords for details of how x and y are handled, and 
 xy.coords says In any other case, the 'x' argument is 
 coerced to a vector and
   returned as *y* component where the resulting 'x' is just the
   index vector '1:n'.  In this case, the resulting 'xlab' 
 component
   is set to 'Index'.
 
 Duncan Murdoch
 
  Thanks,
  Oleg
  
  *** R version 2.7.0 RC (2008-04-20 r45403) 
 [/research/osklyar/R-devel]
  ***
  Axis
  function (x = NULL, at = NULL, ..., side, labels = NULL) {
  cat(In Axis() class(x)=, class(x), ; class(at)=, class(at),
  \n, sep = )
  if (!is.null(x))
  UseMethod(Axis, x)
  else if (!is.null(at))
  UseMethod(Axis, at)
  else axis(side = side, at = at, labels = labels, ...) }
  environment: namespace:graphics
  graphics:::Axis.default
  function (x = NULL, at = NULL, ..., side, labels = NULL) {
  cat(In Axis.default() class(x)=, class(x), ; class(at)=,
  class(at), \n, sep = )
  if (is.null(at)  !is.null(x))
  at = pretty(x)
  axis(side = side, at = at, labels = labels, ...) }
  environment: namespace:graphics
  setClass(MyClass, representation(smth=character),
  contains=numeric)
  [1] MyClass
  a = new(MyClass, runif(10))
  a
  An object of class MyClass
   [1] 0.773237167 0.548630205 0.987956687 0.212667925 0.337135151
  0.112210501
   [7] 0.007140895 0.972028903 0.443581963 0.536452424 Slot smth:
  character(0)
  plot(1:10,a)
  In plot.default() class(x)=integer; class(y)=MyClass In Axis() 
  class(x)=numeric; class(at)=NULL In Axis.default() 
 class(x)=numeric; 
  class(at)=NULL In Axis() class(x)=numeric; class(at)=NULL In 
  Axis.default() class(x)=numeric; class(at)=NULL
  plot(a,1:10)
  In plot.default() class(x)=MyClass; class(y)=integer In Axis() 
  class(x)=numeric; class(at)=NULL In Axis.default() 
 class(x)=numeric; 
  class(at)=NULL In Axis() class(x)=numeric; class(at)=NULL In 
  Axis.default() class(x)=numeric; class(at)=NULL
  b = runif(10)
  class(b)=AnotherClass
  plot(b,1:10)
  In plot.default() class(x)=AnotherClass; class(y)=integer In Axis() 
  class(x)=numeric; class(at)=NULL In Axis.default() 
 class(x)=numeric; 
  class(at)=NULL In Axis() class(x)=numeric; class(at)=NULL In 
  Axis.default() class(x)=numeric; class(at)=NULL
  plot(1:10)
  In plot.default() class(x)=integer; class(y)=NULL In Axis() 
  class(x)=numeric; class(at)=NULL In Axis.default() 
 class(x)=numeric

Re: [Rd] graphics::Axis loosing S3/S4 class attributes of 'x' in 2.7.0 RC

2008-04-22 Thread Sklyar, Oleg (MI London)
So if plot(x) produced rubbish in 2.6.2 in sense of axis formatting
would not that mean that either plot.POSIXct or in fact Axis.POSIXct is
incorrectly defined? I will have a look at those to see if I can find a
fix.

Anyway, it does not seem to have any sense to argue any further, because
for me documented and logical are not the same things. 

This fix effectively makes Axis.POSIXct and all other Axis.* methods
useless as there is now no despatch on Axis taking place in plot.default
and thus it is not clear why Axis and not Axis.default is actually used?
This would at least make the code cleaner. I was thinking that the idea
of methods is actually to have different implementations depending on
the argument class rather than coerce everything to double and use the
default instead.

Dr Oleg Sklyar
Technology Group
Man Investments Ltd
+44 (0)20 7144 3803
[EMAIL PROTECTED] 

 -Original Message-
 From: Duncan Murdoch [mailto:[EMAIL PROTECTED] 
 Sent: 22 April 2008 14:24
 To: Sklyar, Oleg (MI London)
 Cc: R-devel@r-project.org
 Subject: Re: [Rd] graphics::Axis loosing S3/S4 class 
 attributes of 'x' in 2.7.0 RC
 
 On 4/22/2008 9:08 AM, Sklyar, Oleg (MI London) wrote:
  Duncan,
  
  looking further, what has changed from 2.6.2 into 2.7.0 are the 
  following two lines in plot.default, which I think were 
 logical before 
  and are not really logical now:
 
 I believe it is behaving as documented now, so the behaviour 
 is logical, even if it may not be convenient.  In your example
 
 x = Sys.time() + runif(100,1,7200) ## time over two hours, 
 POSIXct plot(x, 1:100) plot(1:100, x)
 
 the 1st works in 2.6.2 and 2.7.0 and the second only works in 2.6.2. 
 But the change below was designed to fix the case
 
 plot(x)
 
 which works in 2.7.0 and *not* in 2.6.2, so reverting the 
 change is not the way to address this.
 
 Duncan Murdoch
 
  
  plot.R: plot.default (2.6.2):
  if (axes) {
  localAxis(x, side=1, ...)
  localAxis(y, side=2, ...)
  }
  
  plot.R: plot.default (2.7.0):
  ...
  if (axes) {
  localAxis(xy$x, side=1, ...)
  localAxis(xy$y, side=2, ...)
  }
  
  The fact that xy.coords is called does not really matter.
  
  
  Dr Oleg Sklyar
  Technology Group
  Man Investments Ltd
  +44 (0)20 7144 3803
  [EMAIL PROTECTED]
  
  -Original Message-
  From: Duncan Murdoch [mailto:[EMAIL PROTECTED]
  Sent: 22 April 2008 13:01
  To: Sklyar, Oleg (MI London)
  Cc: R-devel@r-project.org
  Subject: Re: [Rd] graphics::Axis loosing S3/S4 class attributes of 
  'x' in 2.7.0 RC
  
  On 22/04/2008 7:25 AM, Sklyar, Oleg (MI London) wrote:
   Following my previous post on S3 method despatch, I put
  debug messages
   in the code of Axis, Axis.default and plot.default in 
   graphics/R/axis.R and graphics/R/plot.R to print the 
 class of x, at 
   and y on plot. After recompiling R, what I see is that x 
 *lost* its 
   class attribute (at least for classes not known to 
 'graphics') in 
   Axis, called directly from plot.default and this could be
  the reason
   why R did not despatch on Axis.MyClass from my previous 
 post. This 
   happens for both S3 and S4 classes as in the code below!
  Funny enough,
   even integer was reset to numeric in Axis...
  
  If you look at plot.default, you'll see it passes x and y through 
  xy.coords to get coordinates.  That function ends with
  
  return(list(x=as.double(x), y=as.double(y), xlab=xlab, ylab=ylab))
  
  so that's where classes get removed.  If you don't want this to 
  happen, shouldn't you be defining plot.MyClass, or calling the 
  default with axes=F, and then calling Axis on your object yourself?
  
   Is this really an intended behaviour? It looks very wrong to me!
  
  This is documented:  ?plot.default tells you to look at ?xy.coords 
  for details of how x and y are handled, and xy.coords says In any 
  other case, the 'x' argument is coerced to a vector and
returned as *y* component where the resulting 'x' is just the
index vector '1:n'.  In this case, the resulting 'xlab' 
  component
is set to 'Index'.
  
  Duncan Murdoch
  
   Thanks,
   Oleg
   
   *** R version 2.7.0 RC (2008-04-20 r45403)
  [/research/osklyar/R-devel]
   ***
   Axis
   function (x = NULL, at = NULL, ..., side, labels = NULL) {
   cat(In Axis() class(x)=, class(x), ; class(at)=, 
 class(at),
   \n, sep = )
   if (!is.null(x))
   UseMethod(Axis, x)
   else if (!is.null(at))
   UseMethod(Axis, at)
   else axis(side = side, at = at, labels = labels, ...) }
   environment: namespace:graphics
   graphics:::Axis.default
   function (x = NULL, at = NULL, ..., side, labels = NULL) {
   cat(In Axis.default() class(x)=, class(x), ; class(at)=,
   class(at), \n, sep = )
   if (is.null(at)  !is.null(x))
   at = pretty(x)
   axis(side = side, at = at, labels = labels, ...) }
   environment: namespace:graphics
   setClass(MyClass, representation(smth=character),
   contains=numeric

Re: [Rd] graphics::Axis loosing S3/S4 class attributes of 'x' in 2.7.0 RC

2008-04-22 Thread Gabor Grothendieck
On Tue, Apr 22, 2008 at 9:24 AM, Duncan Murdoch [EMAIL PROTECTED] wrote:
 On 4/22/2008 9:08 AM, Sklyar, Oleg (MI London) wrote:
  Duncan,
 
  looking further, what has changed from 2.6.2 into 2.7.0 are the
  following two lines in plot.default, which I think were logical before
  and are not really logical now:

 I believe it is behaving as documented now, so the behaviour is
 logical, even if it may not be convenient.  In your example

 x = Sys.time() + runif(100,1,7200) ## time over two hours, POSIXct
 plot(x, 1:100)
 plot(1:100, x)

 the 1st works in 2.6.2 and 2.7.0 and the second only works in 2.6.2.
 But the change below was designed to fix the case

 plot(x)


In what sense is plot(x) fixed?  When I try it I get numbers on both axes --
times on neither.   Clearly Axis should not behave in a way which effectively
makes it useless and breaks reasonable old code.

 R.version.string
[1] R version 2.7.0 RC (2008-04-17 r45367)

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


Re: [Rd] graphics::Axis loosing S3/S4 class attributes of 'x' in 2.7.0 RC

2008-04-22 Thread Martin Maechler
 OlegS == Sklyar, Oleg \(MI London\) [EMAIL PROTECTED]
 on Tue, 22 Apr 2008 14:44:01 +0100 writes:

OlegS So if plot(x) produced rubbish in 2.6.2 in sense of axis formatting
OlegS would not that mean that either plot.POSIXct or in fact Axis.POSIXct 
is
OlegS incorrectly defined? I will have a look at those to see if I can 
find a
OlegS fix.

Me too.


OlegS Anyway, it does not seem to have any sense to argue any further, 
because
OlegS for me documented and logical are not the same things. 

It still makes much sense to discuss further.

I agree with you that the change 2.6.2 - 2.7.0  fixed one problem
but introduced another one.

2.7.1 (and before that 2.7.0 patched) should hopefully be
better than both 2.6.2 and 2.7.0

My current version is

if (axes) {
localAxis(if(is.null(y)) xy$x else x, side = 1, ...)
localAxis(if(is.null(y))  x   else y, side = 2, ...)
}

which is I think better already than either predecessor;
it definitely is compatible with Rversion = 2.6.2 when both
(x,y) are specified,
and it produces the correct axes in these three cases:

## Axis() calls via plot()
x - as.Date(2008-04-22 09:45) + (i - 0:4)
plot(x)# not ok in 2.6.2, nor 2.7.0
plot(x, i)# ok in 2.6.2  and 2.7.0
plot(i, x)# ok in 2.6.2 and not in 2.7.0


I'm grateful for further examples, preferably not using code
from packages outside of standard R.

Martin Maechler, ETH Zurich


OlegS This fix effectively makes Axis.POSIXct and all other Axis.* 
methods
OlegS useless as there is now no despatch on Axis taking place in 
plot.default
OlegS and thus it is not clear why Axis and not Axis.default is actually 
used?
OlegS This would at least make the code cleaner. I was thinking that the 
idea
OlegS of methods is actually to have different implementations depending on
OlegS the argument class rather than coerce everything to double and use 
the
OlegS default instead.

OlegS Dr Oleg Sklyar
OlegS Technology Group
OlegS Man Investments Ltd
OlegS +44 (0)20 7144 3803
OlegS [EMAIL PROTECTED] 

 -Original Message-
 From: Duncan Murdoch [mailto:[EMAIL PROTECTED] 
 Sent: 22 April 2008 14:24
 To: Sklyar, Oleg (MI London)
 Cc: R-devel@r-project.org
 Subject: Re: [Rd] graphics::Axis loosing S3/S4 class 
 attributes of 'x' in 2.7.0 RC
 
 On 4/22/2008 9:08 AM, Sklyar, Oleg (MI London) wrote:
  Duncan,
  
  looking further, what has changed from 2.6.2 into 2.7.0 are the 
  following two lines in plot.default, which I think were 
 logical before 
  and are not really logical now:
 
 I believe it is behaving as documented now, so the behaviour 
 is logical, even if it may not be convenient.  In your example
 
 x = Sys.time() + runif(100,1,7200) ## time over two hours, 
 POSIXct plot(x, 1:100) plot(1:100, x)
 
 the 1st works in 2.6.2 and 2.7.0 and the second only works in 2.6.2. 
 But the change below was designed to fix the case
 
 plot(x)
 
 which works in 2.7.0 and *not* in 2.6.2, so reverting the 
 change is not the way to address this.
 
 Duncan Murdoch
 
  
  plot.R: plot.default (2.6.2):
  if (axes) {
 localAxis(x, side=1, ...)
 localAxis(y, side=2, ...)
  }
  
  plot.R: plot.default (2.7.0):
  ...
  if (axes) {
 localAxis(xy$x, side=1, ...)
 localAxis(xy$y, side=2, ...)
  }
  
  The fact that xy.coords is called does not really matter.
  
  
[..]

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


Re: [Rd] graphics::Axis loosing S3/S4 class attributes of 'x' in 2.7.0 RC

2008-04-22 Thread Sklyar, Oleg (MI London)
Ok, so what's wrong with the following fix for plot(x) that would
actually fix what needs to be fixed instead of changing plot.default?
Fix means reverting plot.default in 2.7.0 to what it was (if testing in
2.7.0, copy and paste the OLD plot.default into the .GlobalEnv):

plot.POSIXct - function(x, y, xlab = , ...) {
if (!missing(y)) {
side = 1
plotDef - function(x, y, xaxt, xlab, ...) plot.default(x, y,
xaxt=n, xlab=xlab, ...)
plotDef(x, y, xlab=xlab, ...)
} else {
side = 2
plotDef - function(x, y, yaxt, xlab, ...) plot.default(x, y,
yaxt=n, xlab=xlab, ...)
plotDef(seq_along(x), x, xlab=xlab, ...)
}
## trick to remove arguments intended for title() or plot.default()
axisInt - function(x, type, main, sub, xlab, ylab, col, lty, lwd,
xlim, ylim, bg, pch, log, asp, axes, frame.plot,
...)
axis.POSIXct(side, x, ...)
dots - list(...)
axes - if(axes %in% names(dots)) dots$axes else TRUE
xaxt - if(xaxt %in% names(dots)) dots$xaxt else par(xaxt)
if(axes  xaxt != n) axisInt(x, ...)
}

plot.POSIXlt - function(x, y, xlab = , ...) {
if (missing(y)) plot.POSIXct(as.POSIXct(x), xlab=xlab, ...)
else plot.POSIXct(as.POSIXct(x), y=y, xlab=xlab, ...)
}

And try with:
x = Sys.time() + runif(100,1,7200)
plot(x)
plot(x,1:100)
plot(1:100,x)

plot(as.POSIXlt(x))
plot(as.POSIXlt(x),1:100)
plot(1:100,as.POSIXlt(x))


Dr Oleg Sklyar
Technology Group
Man Investments Ltd
+44 (0)20 7144 3803
[EMAIL PROTECTED] 

 -Original Message-
 From: Duncan Murdoch [mailto:[EMAIL PROTECTED] 
 Sent: 22 April 2008 14:24
 To: Sklyar, Oleg (MI London)
 Cc: R-devel@r-project.org
 Subject: Re: [Rd] graphics::Axis loosing S3/S4 class 
 attributes of 'x' in 2.7.0 RC
 
 On 4/22/2008 9:08 AM, Sklyar, Oleg (MI London) wrote:
  Duncan,
  
  looking further, what has changed from 2.6.2 into 2.7.0 are the 
  following two lines in plot.default, which I think were 
 logical before 
  and are not really logical now:
 
 I believe it is behaving as documented now, so the behaviour 
 is logical, even if it may not be convenient.  In your example
 
 x = Sys.time() + runif(100,1,7200) ## time over two hours, 
 POSIXct plot(x, 1:100) plot(1:100, x)
 
 the 1st works in 2.6.2 and 2.7.0 and the second only works in 2.6.2. 
 But the change below was designed to fix the case
 
 plot(x)
 
 which works in 2.7.0 and *not* in 2.6.2, so reverting the 
 change is not the way to address this.
 
 Duncan Murdoch
 
  
  plot.R: plot.default (2.6.2):
  if (axes) {
  localAxis(x, side=1, ...)
  localAxis(y, side=2, ...)
  }
  
  plot.R: plot.default (2.7.0):
  ...
  if (axes) {
  localAxis(xy$x, side=1, ...)
  localAxis(xy$y, side=2, ...)
  }
  
  The fact that xy.coords is called does not really matter.
  
  
  Dr Oleg Sklyar
  Technology Group
  Man Investments Ltd
  +44 (0)20 7144 3803
  [EMAIL PROTECTED]
  
  -Original Message-
  From: Duncan Murdoch [mailto:[EMAIL PROTECTED]
  Sent: 22 April 2008 13:01
  To: Sklyar, Oleg (MI London)
  Cc: R-devel@r-project.org
  Subject: Re: [Rd] graphics::Axis loosing S3/S4 class attributes of 
  'x' in 2.7.0 RC
  
  On 22/04/2008 7:25 AM, Sklyar, Oleg (MI London) wrote:
   Following my previous post on S3 method despatch, I put
  debug messages
   in the code of Axis, Axis.default and plot.default in 
   graphics/R/axis.R and graphics/R/plot.R to print the 
 class of x, at 
   and y on plot. After recompiling R, what I see is that x 
 *lost* its 
   class attribute (at least for classes not known to 
 'graphics') in 
   Axis, called directly from plot.default and this could be
  the reason
   why R did not despatch on Axis.MyClass from my previous 
 post. This 
   happens for both S3 and S4 classes as in the code below!
  Funny enough,
   even integer was reset to numeric in Axis...
  
  If you look at plot.default, you'll see it passes x and y through 
  xy.coords to get coordinates.  That function ends with
  
  return(list(x=as.double(x), y=as.double(y), xlab=xlab, ylab=ylab))
  
  so that's where classes get removed.  If you don't want this to 
  happen, shouldn't you be defining plot.MyClass, or calling the 
  default with axes=F, and then calling Axis on your object yourself?
  
   Is this really an intended behaviour? It looks very wrong to me!
  
  This is documented:  ?plot.default tells you to look at ?xy.coords 
  for details of how x and y are handled, and xy.coords says In any 
  other case, the 'x' argument is coerced to a vector and
returned as *y* component where the resulting 'x' is just the
index vector '1:n'.  In this case, the resulting 'xlab' 
  component
is set to 'Index'.
  
  Duncan Murdoch
  
   Thanks,
   Oleg
   
   *** R version 2.7.0 RC (2008-04-20 r45403)
  [/research/osklyar/R-devel]
   ***
   Axis
   function (x = NULL, at = NULL, ..., side, labels = NULL) {
   cat(In Axis() class(x)=, class(x), ; class(at)=, 
 class

Re: [Rd] graphics::Axis loosing S3/S4 class attributes of 'x' in 2.7.0 RC

2008-04-22 Thread Duncan Murdoch
There seem to be nonlinearities in the time-space continuum, so this 
message arrived several hours after Martin's, even though both have the 
same timestamp.  Please test his, and see if you can break it.  I'd 
guess not, it looks simple enough, but not too simple.

And for the future:

Please test the alpha/beta/RC releases!  The change we're talking about 
came fairly late in the process, but it was there for the last couple of 
weeks.  It would be easier for everyone if it had been corrected before 
release, rather than after.  It was announced on the RSS list, here:

http://developer.r-project.org/blosxom.cgi/R-2-7-branch/NEWS/2008/04/08#n2008-04-08

so it would really have helped if people who rely on special axis 
handling by Axis had tested the change after they'd seen that notice.

On 4/22/2008 10:26 AM, Sklyar, Oleg (MI London) wrote:
  Ok, so what's wrong with the following fix for plot(x)

The main thing that's wrong with it is that you don't explain what the 
changes are.  I can't believe that the error is specific to the POSIXct 
class, so it doesn't make sense that changes there would fix it in general.

Duncan Murdoch

  that would
 actually fix what needs to be fixed instead of changing plot.default?
 Fix means reverting plot.default in 2.7.0 to what it was (if testing in
 2.7.0, copy and paste the OLD plot.default into the .GlobalEnv):
 
 plot.POSIXct - function(x, y, xlab = , ...) {
 if (!missing(y)) {
 side = 1
 plotDef - function(x, y, xaxt, xlab, ...) plot.default(x, y,
 xaxt=n, xlab=xlab, ...)
 plotDef(x, y, xlab=xlab, ...)
 } else {
 side = 2
 plotDef - function(x, y, yaxt, xlab, ...) plot.default(x, y,
 yaxt=n, xlab=xlab, ...)
 plotDef(seq_along(x), x, xlab=xlab, ...)
 }
 ## trick to remove arguments intended for title() or plot.default()
 axisInt - function(x, type, main, sub, xlab, ylab, col, lty, lwd,
 xlim, ylim, bg, pch, log, asp, axes, frame.plot,
 ...)
 axis.POSIXct(side, x, ...)
 dots - list(...)
 axes - if(axes %in% names(dots)) dots$axes else TRUE
 xaxt - if(xaxt %in% names(dots)) dots$xaxt else par(xaxt)
 if(axes  xaxt != n) axisInt(x, ...)
 }
 
 plot.POSIXlt - function(x, y, xlab = , ...) {
 if (missing(y)) plot.POSIXct(as.POSIXct(x), xlab=xlab, ...)
 else plot.POSIXct(as.POSIXct(x), y=y, xlab=xlab, ...)
 }
 
 And try with:
 x = Sys.time() + runif(100,1,7200)
 plot(x)
 plot(x,1:100)
 plot(1:100,x)
 
 plot(as.POSIXlt(x))
 plot(as.POSIXlt(x),1:100)
 plot(1:100,as.POSIXlt(x))
 
 
 Dr Oleg Sklyar
 Technology Group
 Man Investments Ltd
 +44 (0)20 7144 3803
 [EMAIL PROTECTED] 
 
 -Original Message-
 From: Duncan Murdoch [mailto:[EMAIL PROTECTED] 
 Sent: 22 April 2008 14:24
 To: Sklyar, Oleg (MI London)
 Cc: R-devel@r-project.org
 Subject: Re: [Rd] graphics::Axis loosing S3/S4 class 
 attributes of 'x' in 2.7.0 RC
 
 On 4/22/2008 9:08 AM, Sklyar, Oleg (MI London) wrote:
  Duncan,
  
  looking further, what has changed from 2.6.2 into 2.7.0 are the 
  following two lines in plot.default, which I think were 
 logical before 
  and are not really logical now:
 
 I believe it is behaving as documented now, so the behaviour 
 is logical, even if it may not be convenient.  In your example
 
 x = Sys.time() + runif(100,1,7200) ## time over two hours, 
 POSIXct plot(x, 1:100) plot(1:100, x)
 
 the 1st works in 2.6.2 and 2.7.0 and the second only works in 2.6.2. 
 But the change below was designed to fix the case
 
 plot(x)
 
 which works in 2.7.0 and *not* in 2.6.2, so reverting the 
 change is not the way to address this.
 
 Duncan Murdoch
 
  
  plot.R: plot.default (2.6.2):
  if (axes) {
 localAxis(x, side=1, ...)
 localAxis(y, side=2, ...)
  }
  
  plot.R: plot.default (2.7.0):
  ...
  if (axes) {
 localAxis(xy$x, side=1, ...)
 localAxis(xy$y, side=2, ...)
  }
  
  The fact that xy.coords is called does not really matter.
  
  
  Dr Oleg Sklyar
  Technology Group
  Man Investments Ltd
  +44 (0)20 7144 3803
  [EMAIL PROTECTED]
  
  -Original Message-
  From: Duncan Murdoch [mailto:[EMAIL PROTECTED]
  Sent: 22 April 2008 13:01
  To: Sklyar, Oleg (MI London)
  Cc: R-devel@r-project.org
  Subject: Re: [Rd] graphics::Axis loosing S3/S4 class attributes of 
  'x' in 2.7.0 RC
  
  On 22/04/2008 7:25 AM, Sklyar, Oleg (MI London) wrote:
   Following my previous post on S3 method despatch, I put
  debug messages
   in the code of Axis, Axis.default and plot.default in 
   graphics/R/axis.R and graphics/R/plot.R to print the 
 class of x, at 
   and y on plot. After recompiling R, what I see is that x 
 *lost* its 
   class attribute (at least for classes not known to 
 'graphics') in 
   Axis, called directly from plot.default and this could be
  the reason
   why R did not despatch on Axis.MyClass from my previous 
 post. This 
   happens for both S3 and S4 classes as in the code below!
  Funny enough,
   even integer was reset

Re: [Rd] graphics::Axis loosing S3/S4 class attributes of 'x' in 2.7.0 RC

2008-04-22 Thread Gabor Grothendieck
Its not clear to me at this point what and where the proposed
or already made change is but here
is a test that should produce a year/month style rather than
numeric style X axis:

library(zoo)
z - zoo(1:12, as.yearmon(2000 + 1:12/12))
plot(z)


On Tue, Apr 22, 2008 at 1:18 PM, Duncan Murdoch [EMAIL PROTECTED] wrote:
 There seem to be nonlinearities in the time-space continuum, so this
 message arrived several hours after Martin's, even though both have the
 same timestamp.  Please test his, and see if you can break it.  I'd
 guess not, it looks simple enough, but not too simple.

 And for the future:

 Please test the alpha/beta/RC releases!  The change we're talking about
 came fairly late in the process, but it was there for the last couple of
 weeks.  It would be easier for everyone if it had been corrected before
 release, rather than after.  It was announced on the RSS list, here:

 http://developer.r-project.org/blosxom.cgi/R-2-7-branch/NEWS/2008/04/08#n2008-04-08

 so it would really have helped if people who rely on special axis
 handling by Axis had tested the change after they'd seen that notice.

 On 4/22/2008 10:26 AM, Sklyar, Oleg (MI London) wrote:
   Ok, so what's wrong with the following fix for plot(x)

 The main thing that's wrong with it is that you don't explain what the
 changes are.  I can't believe that the error is specific to the POSIXct
 class, so it doesn't make sense that changes there would fix it in general.

 Duncan Murdoch


   that would
  actually fix what needs to be fixed instead of changing plot.default?
  Fix means reverting plot.default in 2.7.0 to what it was (if testing in
  2.7.0, copy and paste the OLD plot.default into the .GlobalEnv):
 
  plot.POSIXct - function(x, y, xlab = , ...) {
  if (!missing(y)) {
  side = 1
  plotDef - function(x, y, xaxt, xlab, ...) plot.default(x, y,
  xaxt=n, xlab=xlab, ...)
  plotDef(x, y, xlab=xlab, ...)
  } else {
  side = 2
  plotDef - function(x, y, yaxt, xlab, ...) plot.default(x, y,
  yaxt=n, xlab=xlab, ...)
  plotDef(seq_along(x), x, xlab=xlab, ...)
  }
  ## trick to remove arguments intended for title() or plot.default()
  axisInt - function(x, type, main, sub, xlab, ylab, col, lty, lwd,
  xlim, ylim, bg, pch, log, asp, axes, frame.plot,
  ...)
  axis.POSIXct(side, x, ...)
  dots - list(...)
  axes - if(axes %in% names(dots)) dots$axes else TRUE
  xaxt - if(xaxt %in% names(dots)) dots$xaxt else par(xaxt)
  if(axes  xaxt != n) axisInt(x, ...)
  }
 
  plot.POSIXlt - function(x, y, xlab = , ...) {
  if (missing(y)) plot.POSIXct(as.POSIXct(x), xlab=xlab, ...)
  else plot.POSIXct(as.POSIXct(x), y=y, xlab=xlab, ...)
  }
 
  And try with:
  x = Sys.time() + runif(100,1,7200)
  plot(x)
  plot(x,1:100)
  plot(1:100,x)
 
  plot(as.POSIXlt(x))
  plot(as.POSIXlt(x),1:100)
  plot(1:100,as.POSIXlt(x))
 
 
  Dr Oleg Sklyar
  Technology Group
  Man Investments Ltd
  +44 (0)20 7144 3803
  [EMAIL PROTECTED]
 
  -Original Message-
  From: Duncan Murdoch [mailto:[EMAIL PROTECTED]
  Sent: 22 April 2008 14:24
  To: Sklyar, Oleg (MI London)
  Cc: R-devel@r-project.org
  Subject: Re: [Rd] graphics::Axis loosing S3/S4 class
  attributes of 'x' in 2.7.0 RC
 
  On 4/22/2008 9:08 AM, Sklyar, Oleg (MI London) wrote:
   Duncan,
  
   looking further, what has changed from 2.6.2 into 2.7.0 are the
   following two lines in plot.default, which I think were
  logical before
   and are not really logical now:
 
  I believe it is behaving as documented now, so the behaviour
  is logical, even if it may not be convenient.  In your example
 
  x = Sys.time() + runif(100,1,7200) ## time over two hours,
  POSIXct plot(x, 1:100) plot(1:100, x)
 
  the 1st works in 2.6.2 and 2.7.0 and the second only works in 2.6.2.
  But the change below was designed to fix the case
 
  plot(x)
 
  which works in 2.7.0 and *not* in 2.6.2, so reverting the
  change is not the way to address this.
 
  Duncan Murdoch
 
  
   plot.R: plot.default (2.6.2):
   if (axes) {
  localAxis(x, side=1, ...)
  localAxis(y, side=2, ...)
   }
  
   plot.R: plot.default (2.7.0):
   ...
   if (axes) {
  localAxis(xy$x, side=1, ...)
  localAxis(xy$y, side=2, ...)
   }
  
   The fact that xy.coords is called does not really matter.
  
  
   Dr Oleg Sklyar
   Technology Group
   Man Investments Ltd
   +44 (0)20 7144 3803
   [EMAIL PROTECTED]
  
   -Original Message-
   From: Duncan Murdoch [mailto:[EMAIL PROTECTED]
   Sent: 22 April 2008 13:01
   To: Sklyar, Oleg (MI London)
   Cc: R-devel@r-project.org
   Subject: Re: [Rd] graphics::Axis loosing S3/S4 class attributes of
   'x' in 2.7.0 RC
  
   On 22/04/2008 7:25 AM, Sklyar, Oleg (MI London) wrote:
Following my previous post on S3 method despatch, I put
   debug messages
in the code of Axis, Axis.default and plot.default in
graphics/R/axis.R and graphics/R/plot.R to print the
  class

Re: [Rd] graphics::Axis loosing S3/S4 class attributes of 'x' in 2.7.0 RC

2008-04-22 Thread Duncan Murdoch
On 4/22/2008 1:29 PM, Gabor Grothendieck wrote:
 Its not clear to me at this point what and where the proposed
 or already made change is but here
 is a test that should produce a year/month style rather than
 numeric style X axis:
 
 library(zoo)
 z - zoo(1:12, as.yearmon(2000 + 1:12/12))
 plot(z)

It does.

Duncan Murdoch

 
 
 On Tue, Apr 22, 2008 at 1:18 PM, Duncan Murdoch [EMAIL PROTECTED] wrote:
 There seem to be nonlinearities in the time-space continuum, so this
 message arrived several hours after Martin's, even though both have the
 same timestamp.  Please test his, and see if you can break it.  I'd
 guess not, it looks simple enough, but not too simple.

 And for the future:

 Please test the alpha/beta/RC releases!  The change we're talking about
 came fairly late in the process, but it was there for the last couple of
 weeks.  It would be easier for everyone if it had been corrected before
 release, rather than after.  It was announced on the RSS list, here:

 http://developer.r-project.org/blosxom.cgi/R-2-7-branch/NEWS/2008/04/08#n2008-04-08

 so it would really have helped if people who rely on special axis
 handling by Axis had tested the change after they'd seen that notice.

 On 4/22/2008 10:26 AM, Sklyar, Oleg (MI London) wrote:
   Ok, so what's wrong with the following fix for plot(x)

 The main thing that's wrong with it is that you don't explain what the
 changes are.  I can't believe that the error is specific to the POSIXct
 class, so it doesn't make sense that changes there would fix it in general.

 Duncan Murdoch


   that would
  actually fix what needs to be fixed instead of changing plot.default?
  Fix means reverting plot.default in 2.7.0 to what it was (if testing in
  2.7.0, copy and paste the OLD plot.default into the .GlobalEnv):
 
  plot.POSIXct - function(x, y, xlab = , ...) {
  if (!missing(y)) {
  side = 1
  plotDef - function(x, y, xaxt, xlab, ...) plot.default(x, y,
  xaxt=n, xlab=xlab, ...)
  plotDef(x, y, xlab=xlab, ...)
  } else {
  side = 2
  plotDef - function(x, y, yaxt, xlab, ...) plot.default(x, y,
  yaxt=n, xlab=xlab, ...)
  plotDef(seq_along(x), x, xlab=xlab, ...)
  }
  ## trick to remove arguments intended for title() or plot.default()
  axisInt - function(x, type, main, sub, xlab, ylab, col, lty, lwd,
  xlim, ylim, bg, pch, log, asp, axes, frame.plot,
  ...)
  axis.POSIXct(side, x, ...)
  dots - list(...)
  axes - if(axes %in% names(dots)) dots$axes else TRUE
  xaxt - if(xaxt %in% names(dots)) dots$xaxt else par(xaxt)
  if(axes  xaxt != n) axisInt(x, ...)
  }
 
  plot.POSIXlt - function(x, y, xlab = , ...) {
  if (missing(y)) plot.POSIXct(as.POSIXct(x), xlab=xlab, ...)
  else plot.POSIXct(as.POSIXct(x), y=y, xlab=xlab, ...)
  }
 
  And try with:
  x = Sys.time() + runif(100,1,7200)
  plot(x)
  plot(x,1:100)
  plot(1:100,x)
 
  plot(as.POSIXlt(x))
  plot(as.POSIXlt(x),1:100)
  plot(1:100,as.POSIXlt(x))
 
 
  Dr Oleg Sklyar
  Technology Group
  Man Investments Ltd
  +44 (0)20 7144 3803
  [EMAIL PROTECTED]
 
  -Original Message-
  From: Duncan Murdoch [mailto:[EMAIL PROTECTED]
  Sent: 22 April 2008 14:24
  To: Sklyar, Oleg (MI London)
  Cc: R-devel@r-project.org
  Subject: Re: [Rd] graphics::Axis loosing S3/S4 class
  attributes of 'x' in 2.7.0 RC
 
  On 4/22/2008 9:08 AM, Sklyar, Oleg (MI London) wrote:
   Duncan,
  
   looking further, what has changed from 2.6.2 into 2.7.0 are the
   following two lines in plot.default, which I think were
  logical before
   and are not really logical now:
 
  I believe it is behaving as documented now, so the behaviour
  is logical, even if it may not be convenient.  In your example
 
  x = Sys.time() + runif(100,1,7200) ## time over two hours,
  POSIXct plot(x, 1:100) plot(1:100, x)
 
  the 1st works in 2.6.2 and 2.7.0 and the second only works in 2.6.2.
  But the change below was designed to fix the case
 
  plot(x)
 
  which works in 2.7.0 and *not* in 2.6.2, so reverting the
  change is not the way to address this.
 
  Duncan Murdoch
 
  
   plot.R: plot.default (2.6.2):
   if (axes) {
  localAxis(x, side=1, ...)
  localAxis(y, side=2, ...)
   }
  
   plot.R: plot.default (2.7.0):
   ...
   if (axes) {
  localAxis(xy$x, side=1, ...)
  localAxis(xy$y, side=2, ...)
   }
  
   The fact that xy.coords is called does not really matter.
  
  
   Dr Oleg Sklyar
   Technology Group
   Man Investments Ltd
   +44 (0)20 7144 3803
   [EMAIL PROTECTED]
  
   -Original Message-
   From: Duncan Murdoch [mailto:[EMAIL PROTECTED]
   Sent: 22 April 2008 13:01
   To: Sklyar, Oleg (MI London)
   Cc: R-devel@r-project.org
   Subject: Re: [Rd] graphics::Axis loosing S3/S4 class attributes of
   'x' in 2.7.0 RC
  
   On 22/04/2008 7:25 AM, Sklyar, Oleg (MI London) wrote:
Following my previous post on S3 method despatch, I put
   debug messages
in the code of Axis, Axis.default