Giles Heywood wrote:
I see - clearly I had confused the extended superclass with a slot. I'm not sure that this correction to my thinking moves me closer to my objective, however (i.e. extending array and allowing 2D array, as was allowed in 1.9.1).
In such a situation I return to the documentation and examples. I have a further question about documentation. The Green Book, valuable and frequently cited as it is, is now in many ways increasingly difficult to relate to R, except at a somewhat abstract level (I fully understand that R is a separate implementation of the S language etc). I also have found Venables and Ripley ch5 most helpful. Is there in existence documentation which provides an overview of the methods package as it now stands, rather like an updated Green Book? Or are there specific packages or example packages which illustrate most of, or much of, the functionality (I have found SparseM useful in this way)?
TIA
Giles
-----Original Message----- From: John Chambers [mailto:[EMAIL PROTECTED] Sent: 10 January 2005 22:10 To: Giles Heywood Cc: r-devel@stat.math.ethz.ch Subject: Re: [Rd] S4 class no longer accepts matrix in array slot under 2.0.1
Your example and your subject heading are two different things. If you meant the subject heading, that in fact works.
R> setClass("a1", representation(x="array")) [1] "a1" R> new("a1", x=matrix(1:12,3,4)) An object of class "a1" Slot "x": [,1] [,2] [,3] [,4] [1,] 1 4 7 10 [2,] 2 5 8 11 [3,] 3 6 9 12
That's not what your example does. In your example, the new class extends "array", rather than using it as a slot. It would have been clearer if you had said setClass("foo", contains="array"), but your code is correct for that purpose.
On first examination, I believe the problem is just what the message says it is. You gave as a new object (and NOT as a slot) an object from a subclass of a superclass of "foo". This is allowed, but has to be done by replacing the part of a "foo" object corresponding to the "array" contained in a "matrix" object. Of course, we know that's actually the whole object, but nothing has told the software this. And, indeed, it doesn't find the necessary replacement method.
Here's an example similar to what you are doing, but using actual classes. Barring screwups on my part, it shows that the mechanism works as asserted. Classes "c1", "c2", "c3" follow the roles of "array", "matrix", and "foo" in your example. R> setClass("c1", representation(x="numeric")) [1] "c1" R> setClass("c2", contains="c1") [1] "c2" R> setClass("c3", contains = "c1") [1] "c3" R> x2 = new("c2", x=1) R> x3 = new("c3", x2) R> x3 An object of class "c3" Slot "x": [1] 1
Classes "matrix" and "array" are rather peculiar in R; among other things, they act like vector data types in that is.object() is FALSE. And you cannot have an "array" with a dimension of length 2.
R> class(array(1:12, dim=c(3,4))) [1] "matrix"
Also, because they don't have a consistent set of "slots" (they may or may not have a "dimnames), they aren't quite real classes in an S4 sense. It would be nice to fix this mess, but not obviously possible while being back compatible.
It's possible that there is a fix to get around the particular error here, without breaking the more general pattern--I'll take a look.
Otherwise, you may need to follow the approach of your subject heading, and define a new class with an array as a slot.
Giles Heywood wrote:
I have an S4 class with a slot of class "array", and inupgrading to 2.0.1
(from 1.9.1) I have encountered a change in behaviour. Thiscauses me some
I see that Rdifficulties if I want to allow 2-dimensional arrays in the slot.
The following (in 2.0.1) illustrates the point:
setClass("foo",representation("array"))
[1] "foo"
a <- new("foo",array(NA,2:4))
b <- new("foo",matrix(NA,2,3))
Error in "as<-"(`*tmp*`, Classi, value = c(NA, NA, NA, NA, NA, NA)) : No method or default for as() replacement of "foo" with Class="matrix"
This last error did not occur under 1.9.1.
I conclude that in this context the methods package does not recognise
"matrix" as a subclass of "array". However if I use getClass(),
recognises "matrix" as a subclass of "array" (and vice-versa).So is this
new behaviour correct?You conclude incorrectly, as noted above.
[this is a re-posting to R-devel of a question earlier posted to R-help, which attracted limited response]
______________________________________________ R-devel@stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
______________________________________________ R-devel@stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
Hi,
You will find some info material about S4 at the www.bioconductor.org page. There is also a tutorial by R. Gentleman about S4 at: http://www.stat.auckland.ac.nz/S-Workshop/
I have started to write a mansucript about inheritance in S4. You can find it at.
http://www.molgen.mpg.de/~wolski/Robject/Extending.pdf http://www.molgen.mpg.de/~wolski/Robject/Extending.Rnw
Eryk
Ps. If you find the Extending.Rnw file usefull and find any erros would you be so kind to edit the file and send it back to me?
-- Dipl. bio-chem. Witold Eryk Wolski MPI-Moleculare Genetic Ihnestrasse 63-73 14195 Berlin tel: 0049-30-83875219 __("< _ http://www.molgen.mpg.de/~wolski \__/ 'v' http://r4proteomics.sourceforge.net || / \ mail: [EMAIL PROTECTED] ^^ m m [EMAIL PROTECTED]
______________________________________________ R-devel@stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-devel