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]]

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to