Sklyar, Oleg (MI London)
2008-Apr-22 11:25 UTC
[Rd] graphics::Axis loosing S3/S4 class attributes of 'x' in 2.7.0 RC
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... Is this really an intended behaviour? It looks very wrong to me! Thanks, Oleg *** R version 2.7.0 RC (2008-04-20 r45403) [/research/osklyar/R-devel] ***> Axisfunction (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.defaultfunction (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)) > aAn 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
Duncan Murdoch
2008-Apr-22 12:01 UTC
[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_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
Possibly Parallel Threads
- S3 method despatch (changed between 2.6.2 and 2.7.0 RC?)
- setClassUnion with numeric; extending class union
- Overriding axis formatting with custom Axis method, Axis.numeric etc
- 'cat' and 'write' as generic, just like 'c', 'cbind' etc?
- Catch 22 with after_save. Please help.