From murdoch at stats.uwo.ca  Tue Apr 22 14:01:14 2008
From: murdoch at stats.uwo.ca (Duncan Murdoch)
Date: Tue, 22 Apr 2008 08:01:14 -0400
Subject: [Rd] graphics::Axis loosing S3/S4 class attributes of 'x' in
 2.7.0	RC
In-Reply-To: <1A68FCB28DE72F4BA3B967E6506CCE430229487F@mildnpexmb01.maninvestments.ad.man.com>
References: <1A68FCB28DE72F4BA3B967E6506CCE430229487F@mildnpexmb01.maninvestments.ad.man.com>
Message-ID: <480DD38A.7090004@stats.uwo.ca>

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



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