On Wed, 2014-03-19 at 19:22 -0700, Ross Boylan wrote: > I've tweaked Rmpi and want to have some variables that hold data in the > package. One of the R files starts > mpi.isend.obj <- vector("list", 500) #mpi.request.maxsize()) > > mpi.isend.inuse <- rep(FALSE, 500) #mpi.request.maxsize()) > > and then functions update those variables with <<-. When run: > Error in mpi.isend.obj[[i]] <<- .force.type(x, type) : > > cannot change value of locked binding for 'mpi.isend.obj' > > I'm writing to ask the proper way to accomplish this objective (getting > a variable I can update in package namespace--or at least somewhere > useful and hidden from the outside). > I've discovered one way to do it: In one of the regular R files mpi.global <- new.env()
Then at the end of .onLoad in zzz.R: assign("mpi.isend.obj", vector("list", mpi.request.maxsize()), mpi.global) and similary for the logical vector mpi.isend.inuse Access with functions like this: ## Next 2 functions have 3 modes ## foo() returns foo from mpi.global ## foo(request) returns foo[request] from mpi.global ## foo(request, value) set foo[request] to value mpi.isend.inuse <- function(request, value) { if (missing(request)) return(get("mpi.isend.inuse", mpi.global)) i <- request+1L parent.env(mpi.global) <- environment() if (missing(value)) return(evalq(mpi.isend.inuse[i], mpi.global)) return(evalq(mpi.isend.inuse[i] <- value, mpi.global)) } # request, if present, must be a single value mpi.isend.obj <- function(request, value){ if (missing(request)) return(get("mpi.isend.obj", mpi.global)) i <- request+1L parent.env(mpi.global) <- environment() if (missing(value)) return(evalq(mpi.isend.obj[[i]], mpi.global)) return(evalq(mpi.isend.inuse[[i]] <- value, mpi.global)) } This is pretty awkward; I'd love to know a better way. Some of the names probably should change too: mpi.isend.obj() sounds too much as if it actually sends something, like mpi.isend.Robj(). Ross ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel