Hi,

The topic of extending S4 classes from S3 classes was discussed several times.
e.g.


S3 classes .... "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."

http://tolstoy.newcastle.edu.au/R/devel/05/01/1905.html


Eryk

Ps. A google search: *r-devel S4 array list* etc. Will provide you with more references.


Iago Mosqueira wrote:

On Thu, 2005-02-17 at 12:32, Prof Brian Ripley wrote:



and you are talking about *names of* dimnames).



Sorry for the confusion.



It `works' for arrays because the definition there (in ?Extract) is not the same as the generic you are using: notice the ... in the definitions, and for arrays it is really "["(x, ..., drop=TRUE) and the names of ... are ignored.



Thanks. I did realise for arrays the names are ignored, but in the new class they are not even accepted.



so argument names are ignored for the primitives, but not for S3 methods
(and I believe not for S4 methods).



I am afraid I fail to see then why my example code fails to accept names when subsetting. Shouldn't a class that extends "array" inherit this behaviour too?

Many thanks,


Iago





                           From:
Iago Mosqueira
<[EMAIL PROTECTED]>
                             To:
r-help@stat.math.ethz.ch
                        Subject:
Subsetting using dimnames on S4
array-based class
                           Date:
Fri, 11 Feb 2005 08:29:03 +0000

Hello,

I am encountering some problems when overloading the "[" operator for a
new S4 class based on array. This is an example class definition:

setClass("foo",
      representation("array"),
      prototype(array(NA, dim=c(3,3)),
      dimnames=list(age=1:3, year=10:12))
)

And this the corresponding setMethod with print estatements to see what
is being passed:

setMethod("[", signature(x="foo"),
  function(x, i="missing", j="missing", ..., drop="missing") {
      print(paste("i:", i))
      print(paste("j:", j))
   }
)


So I first create a new object and load it with some data:



x <- new("foo")
x[,] <- 1:9


And then apply subsetting without using the dimension names and see what
are the values of i and j inside the function:



x[1:2,'10']


[1] "i: 1" "i: 2"
[1] "j: 10"


Both i and j hold exactly what was expected here. But if I use the dimension names, the subsetting indices does not seem to be passed as I expected:



x[age=1:3, year=1:3]


[1] "i: missing"
[1] "j: missing"


x[, year='10']


[1] "i: missing"
[1] "j: missing"

Subsetting with dimnames appears to work without trouble on an array,
which "foo" extends:

s<-array(1:9,dim=c(3,3),dimnames=list(age=1:3,year=1:3))


s[1,2:3]


2 3
4 7


s[age=1,year=2:3]


2 3
4 7

Although dimnames seem to be in fact simply ignored:



s[a=1,b=3]


[1] 7


System: Linux Debian 3.0 R 2.0.0

Do I need to define my class differently for subsetting using dimnames
to work? Even if they are not really being checked, I would like to be
able to use subsetting in this way as it makes code more readable when
using arrays with many dimensions.



______________________________________________ R-devel@stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-devel





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

Reply via email to