[R] redefining [ (subset) for array

ghostwheel lachmann at eva.mpg.de
Thu Apr 26 11:11:09 CEST 2012


Hi,

I'm having a hard time redefining the subset operation for arrays. The aim
is to be able to call a[dim2=1:5] instead of having to write a[,1:5,,,]
(assuming dimnames(a)[2]=-"dim2").
I already wrote a function that does this (see bottom).
But I just can't figure out how to redefine "[.array".
I tried 
"[.array"<-function(x,...) {cat("got here\n");42}
But this isn't called when I do
a=array(1:24,c(2,3,4))
a[1,2,3]
I tried
setMethod("[",  signature(x="array"),function(x,...) { cat("got here\n";42}
)
But that gives me an error:
--
Error in setMethod("[", signature(x = "array"), function(x, ...) { : 
  the method for function '[' and signature x="array" is sealed and cannot
be re-defined
--

Here is the function I'm trying to use:

"[.array"=function( input.array,...){                                                                                                                                                                      
  args=list(...)                                                                                                                                                                                            
  if( length(names(args))==0 ) {                                                                                                                                                                            
    d = args                                                                                                                                                                                                
  } else {                                                                                                                                                                                                  
    d=dimnames( input.array )                                                                                                                                                                               
    for(n in names(args)) {                                                                                                                                                                                 
      i=args[[n]]                                                                                                                                                                                           
      if( is.numeric(i)) {                                                                                                                                                                                  
        if( length(d[[n]]) == 0) d[[n]]=i                                                                                                                                                                   
        else d[[n]]=d[[n]][i]                                                                                                                                                                               
      } else d[[n]]=args[[n]]                                                                                                                                                                               
    }                                                                                                                                                                                                       
  }                                                                                                                                                                                                         
  dd=dim( input.array )                                                                                                                                                                                     
  for(i in seq(along=dd))                                                                                                                                                                                   
    if( length(d[[i]])==0) d[[i]] = seq( dd[i])                                                                                                                                                             
  i=sapply(d,length)>1                                                                                                                                                                                      
  new.dimnames=dimnames(input.array)[i]                                                                                                                                                                     
  d=c(list( input.array ),d)                                                                                                                                                                                
  ret = do.call(".subset",d)                                                                                                                                                                                
  if( length(dim(ret))>0 )                                                                                                                                                                                  
    dimnames(ret) = new.dimnames                                                                                                                                                                            
  ret                                                                                                                                                                                                       
} 
---


--
View this message in context: http://r.789695.n4.nabble.com/redefining-subset-for-array-tp4589280p4589280.html
Sent from the R help mailing list archive at Nabble.com.



More information about the R-help mailing list