From wolski at molgen.mpg.de  Thu Feb 17 14:21:08 2005
From: wolski at molgen.mpg.de (Witold Eryk Wolski)
Date: Thu Feb 17 14:21:26 2005
Subject: [Rd] Subsetting using dimnames on S4 array-based class
In-Reply-To: <1108649023.25464.10.camel@xurelo.azti.local>
References: <200502171119.j1HBImXa002842@hypatia.math.ethz.ch>	<1108643876.2771.193.camel@xurelo.azti.local>	<Pine.LNX.4.61.0502171200230.21232@gannet.stats>
	<1108649023.25464.10.camel@xurelo.azti.local>
Message-ID: <42149A44.1010008@molgen.mpg.de>

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


-- 
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: witek96@users.sourceforge.net    ^^     m m
      wolski@molgen.mpg.de


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