I am trying to optimize code for speed and readability for a fairly complex function inside an MCMC sampler. As of now I have a bunch of variables inside a function that get iteratively reset inside a loop. Something like this:

set.seed(1)
K <- 10
v1 <- rnorm(K)
v2 <- rnorm(K)
v3 <- rnorm(K)
steps <- 5
row.active <- matrix(rbinom(K*steps, 1, .7), nr = K, nc = steps)

cbind(v1,v2,v3)

for(ii in 1:steps) {
    v1[row.active[,ii]] <- 2*v1[row.active[,ii]]
    v2[row.active[,ii]] <- 3*v3[row.active[,ii]]^(v1[row.active[,ii]])
    v3[row.active[,ii]] <- (v2[row.active[,ii]] + v3[row.active[,ii]] + 3)^2
}

cbind(v1,v2,v3)


Id like to be able to do this more succinctly with something like the following. This would also allow me to store all the variables in a matrix, which seems better than having so many variables (I actually have about 50).

v1 <- rnorm(K)
v2 <- rnorm(K)
v3 <- rnorm(K)
vars <- cbind(v1,v2,v3)

for(ii in 1:steps) {
    vars[row.active[,ii]] <- within(vars[row.active[,ii]], {
        v1 <- 2*v1
        v2 <- 3*v3^v1
        v3 <- (v2+v3 + 3)^2
    })
}

But I get this error because with() & within() don’t work on objects that aren’t environments such as matrices.


> + . + Error in UseMethod("within") : 
  no applicable method for 'within' applied to an object of class "c('double', 'numeric’)"


It’s important that I keep this as a matrix and not a data.frame or list because I’m trying to optimize for speed.  Help is much appreciated. Thanks!

Steve


Steve Bellan, PhD, MPH
Post-doctoral Researcher
Lauren Ancel Meyers Research Group
Center for Computational Biology and Bioinformatics
University of Texas at Austin
http://www.bio.utexas.edu/research/meyers/steve_bellan/


	[[alternative HTML version deleted]]

