Iago Mosqueira
2005-Feb-11 08:29 UTC
[R] Subsetting using dimnames on S4 array-based class
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
