R: Apply a function to array element indices

do.index {magic} | R Documentation

## Apply a function to array element indices

### Description

Given a function `f()` that takes a vector of indices, and an array of arbitrary dimensions, apply `f()` to the elements of `a`

### Usage

    do.index(a, f, ...)

### Arguments

`a` | Array
`f` | Function that takes a vector argument of the same length as `dim(a)`
`...` | Further arguments supplied to `f()`

### Value

Returns a matrix of the same dimensions as `a`

### Note

Tamas Papp suggests the one-liner `function(a, f, ...) { array(apply(as.matrix(expand.grid(lapply(dim(a),seq_len),KEEP.OUT.ATTRS=FALSE)),1,f, ...),dim(a))}` which is functionally identical to `do.index()`; but it is no faster than the version implemented in the package, and (IMO) is harder to read.

Further note that function `arow()` is much much faster than `do.index()`; it is often possible to rephrase a call to `do.index()` as a call to `arow()`; do this where possible unless the additional code opacity outweighs the speed savings.

### Author(s)

Robin K. S. Hankin, with improvements by Gabor Grothendieck and Martin Maechler, via the R help list

### See Also

`arow`

### Examples

    a <- array(0,c(2,3,4))
    b <- array(rpois(60,1),c(3,4,5))

    f1 <- function(x){sum(x)}
    f2 <- function(x){sum((x-1)^2)}
    f3 <- function(x){b[t(x)]}
    f4 <- function(x){sum(x)%%2}
    f5 <- function(x,u){x[u]}

    do.index(a,f1)    # should match   arow(a,1)+arow(a,2)+arow(a,3)
    do.index(a,f2)
    do.index(a,f3)    # same as  apltake(b,dim(a))
    do.index(a,f4)    # Male/female toilets at NOC
    do.index(a,f5,2)  # same as  arow(a,2)

[Package magic version 1.5-6 Index]