From: Iago Mosqueira <imosqueira_at_suk.azti.es>

Date: Fri 18 Feb 2005 - 01:03:44 EST

R-devel@stat.math.ethz.ch mailing list

https://stat.ethz.ch/mailman/listinfo/r-devel Received on Thu Feb 17 23:13:01 2005

Date: Fri 18 Feb 2005 - 01:03:44 EST

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
**> > <imosqueira@suk.azti.es>
**> > 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 Received on Thu Feb 17 23:13:01 2005

*
This archive was generated by hypermail 2.1.8
: Fri 18 Mar 2005 - 09:02:53 EST
*