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

Iago Mosqueira imosqueira at suk.azti.es
Fri Feb 11 09:29:03 CET 2005


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.

Many thanks,


Iago Mosqueira




More information about the R-help mailing list