[Rd] Subsetting using dimnames on S4 array-based class

Iago Mosqueira imosqueira at suk.azti.es
Thu Feb 17 15:03:44 CET 2005


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 at suk.azti.es>
> >                               To:
> > r-help at 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.



More information about the R-devel mailing list