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

Gabor Grothendieck ggrothendieck at gmail.com
Tue Apr 22 15:11:40 CEST 2008


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;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
> > >
> > >
> > > 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