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

Sklyar, Oleg (MI London) osklyar at maninvestments.com
Tue Apr 22 15:12:49 CEST 2008


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
osklyar at maninvestments.com 

> -----Original Message-----
> From: Gabor Grothendieck [mailto:ggrothendieck at gmail.com] 
> Sent: 22 April 2008 14:12
> To: Sklyar, Oleg (MI London)
> Cc: Duncan Murdoch; R-devel at 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) 
> <osklyar at maninvestments.com> 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
> > osklyar at maninvestments.com
> >
> >
> > > -----Original Message-----
> > > From: Duncan Murdoch [mailto:murdoch at stats.uwo.ca]
> > > Sent: 22 April 2008 13:01
> > > To: Sklyar, Oleg (MI London)
> > > Cc: R-devel at 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;L
> > > C_
> > > > MO
> > > >
> > > 
> NETARY=C;LC_MESSAGES=en_GB.UTF-8;LC_PAPER=en_GB.UTF-8;LC_NAME=C;LC_A
> > > DD
> > > > 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
> > > >
> > > >
> > > > Dr Oleg Sklyar
> > > > Technology Group
> > > > Man Investments Ltd
> > > > +44 (0)20 7144 3803
> > > > osklyar at maninvestments.com
> > > >
> > > >
> > > >
> > > 
> ********************************************************************
> > > **
> > > > 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,
> > > subscribe, sell or
> > > > redeem any investment instruments or to perform other such 
> > > > transactions of any kind. Man Investments reserves the right to 
> > > > monitor, record and retain all electronic communications
> > > through its
> > > > network to ensure the integrity of its systems, for record
> > > keeping and
> > > > regulatory purposes.
> > > >
> > > > Visit us at: www.maninvestments.com
> > > >
> > > > ______________________________________________
> > > > R-devel at r-project.org mailing list 
> > > > https://stat.ethz.ch/mailman/listinfo/r-devel
> > >
> > >
> >
> > ______________________________________________
> > R-devel at r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-devel
> >
> 



More information about the R-devel mailing list