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, 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@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel