# [R] spinning and flipping arrays

Bill Rising brising at louisville.edu
Tue May 27 03:44:27 CEST 2003

```On 5/26/2003 17:21, Peter Dalgaard BSA wrote

>Bill Rising <brising at louisville.edu> writes:
>
>> On 5/26/2003 15:05, Spencer Graves wrote
>>
[snip...]

This seems to work for the flipping (and it relies on textual
representations, and is completely unreadable, and is inelegant):

fliparr <-
function(arr,dims=length(dim(arr))) {
#defaults to flipping across last dimension, otherwise takes
#  a vector of dimensions (which ignores dimesions which are out of
bounds)
# NO error checking yet
# initialize a series of blank strings for the indices
strarg <- vector("character",arrsize <- length(arrdim<-dim(arr)))
# find which indices will be flipped (logical vector)
which <-  apply(outer(1:arrsize,as.vector(dims),"=="),1,any)
# use 1:dimension size for non-flipped dimensions
strarg[!which] <- paste(NULL,arrdim[!which],sep="1:")
# use dimension size:1 for flipped dimensions
strarg[which] <- paste(arrdim[which],NULL,sep=":1")
# paste all the text together and hope syntax never changes

eval(parse(text=paste("arr[",paste(strarg,collapse=","),"]",collapse="")))
}

>
>Relying on textual representation always looks dodgy to me.

You've got a good point.

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

This works quite well for spinning an equal amount in each dimension. I
think I can use this to work on the equivalent to APL which either uses a
single number to spin a single dimension (like spin(foo,c(something,0,0))
) or an array with the dimensions of the original array minus the
dimension around which items are spun, so that the items can be shifted
differenent amounts.

>
>(Note: mapply() was introduced in 1.7.0).

I'll check out mapply. thanks,

Bill

```