[R] spinning and flipping arrays

Peter Dalgaard BSA p.dalgaard at biostat.ku.dk
Mon May 26 23:14:31 CEST 2003


Bill Rising <brising at louisville.edu> writes:

> On 5/26/2003 15:05, Spencer Graves wrote
> 
> >	  I know of no single function to do this;  perhaps someone else does. 
> >  I don't have time to write and debug functions to do this myself, but 
> >it should be easy enough to write functions like the following:
> >
> >flip3 <-
> >function(x){
> >   n3 <- dim(x)[3]
> >   x[,,n3:1]
> >}
> >spin3 <-
> >function(x, k=1){
> >   n3 <- dim(x)[3]
> >   x[,,1+(((1+k):(n3+k))%%n3)]
> >}
> 
> These are pretty much what I'd figured out...
> 
> >
> >With a little more work, I could generate functions that would do this 
> >for any dimension of arrays with any number of dimensions.  To do that, 
> >I might have to compute S-Plus commands using "cmd <- paste(...)" and 
> >then execute them using "eval(parse(text=cmd))".

> This last piece is what I think I needed. I had been trying to just put 
> the 
> /argument/ to the "[" command together, instead of putting together the 
> entire command.
> 
> Thanks for the tip. I'll keep working on it.

Relying on textual representation always looks dodgy to me. How about

spin <- function(x,amount=c(1,rep(0,length(dim(x))-1))) {
    indices <- mapply(function(n,k) (seq(length=n)+k-1)%%n + 1,
                      dim(x),amount, SIMPLIFY=FALSE)
    do.call("[", c(list(x), indices))
}

(Note: mapply() was introduced in 1.7.0). Notice that it is much
easier to use 1:n than to try to generate an empty index for "[".

-- 
   O__  ---- Peter Dalgaard             Blegdamsvej 3  
  c/ /'_ --- Dept. of Biostatistics     2200 Cph. N   
 (*) \(*) -- University of Copenhagen   Denmark      Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)             FAX: (+45) 35327907




More information about the R-help mailing list