Re: [Rd] S4 class no longer accepts matrix in array slot under 2.0.1

From: Witold Eryk Wolski <wolski_at_molgen.mpg.de>
Date: Tue 11 Jan 2005 - 23:04:00 EST

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:jmc@R-project.org]
>>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 in
>>>
>>>
>>upgrading to 2.0.1
>>
>>
>>>(from 1.9.1) I have encountered a change in behaviour. This
>>>
>>>
>>causes me some
>>
>>
>>>difficulties 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(),
>>>
>>>
>>I see that R
>>
>>
>>>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: witek96@users.sourceforge.net    ^^     m m
      wolski@molgen.mpg.de

______________________________________________
R-devel@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Received on Tue Jan 11 22:11:53 2005

This archive was generated by hypermail 2.1.8 : Tue 11 Jan 2005 - 23:20:36 EST