[R] combinatorial programming problem

Kjetil Brinchmann Halvorsen kjetilbrinchmannhalvorsen at gmail.com
Fri May 26 18:58:48 CEST 2006


Hola!

I am programming a class (S3) "symarray" for
storing the results of functions symmetric in its
k arguments. Intended use is for association indices
for more than two variables, for instance coresistivity
against antibiotics.

There is one programming problem I haven't solved, making an inverse
of the index function indx() --- se code below. It could for instance 
return the original k indexes in strictly increasing order, to make 
indx() formally invertible.

Any ideas?

Kjetil


Code:


# Implementing an S3 class for symarrays with array rank r for dimension
# [k, k, ..., k] with k>=r repeated r times. We do not store the diagonal.

# Storage requirement is given by {r, k}=  choose(k, r)
# where r=array rank, k=maximum index

symarray <- function(data=NA, dims=c(1,1)){
      r <- dims[1]
      k <- dims[2]
      if(r > k) stop("symarray needs dimension larger than array rank")
      len <- choose(k, r)
      out <- data[1:len]
      attr(out, "dims") <- dims
      class(out) <- "symarray"
      out
}

# Index calculation:

indx <- function(inds, k){
    r <- length(inds)
    if(r==1) return(inds) else {
       if(inds[1]==1) {
          return( indx(inds[-1]-1, k-1 ) ) } else {
          return( indx(c(inds[1]-1, seq(from=k-r+2, by=1, to=k)), k) +
                  indx( inds[-1]-inds[1], k-inds[1] ))
          }
    }
   } # end indx

# Methods for assignment and indexing:

"[.symarray" <- function(x, inds, drop=FALSE){
         dims <- attr(x, "dims")
         k <- dims[2]
         inds <- indx(inds, k)
         res <- NextMethod("[", x)
         res
}

"[<-.symarray" <- function(x, inds, value){
     dims <- attr(x, "dims")
     k <- dims[2]
     inds <- indx(inds, k)
     res <- NextMethod("[<-", x)
     res
}



More information about the R-help mailing list