William Dunlap Wed, 4 Jan 2012 22:54:41 +0000 > R functions [can] use their enclosing environments to save state.
Aha! > makeStack <- function () { > stack <- list() > list(pop = function() { > if (length(stack) == 0) { # get from an enclosing env. > retval <- NULL > } else { > retval <- stack[[length(stack)]] # get from an enclosing env. > stack <<- stack[-length(stack)] # assign in an enclosing env. > } > retval > }, push = function(x) { > stack[[length(stack) + 1]] <<- x # assign in an enclosing env. > invisible(x) > }) > } Thanks, that's quite clear. > There are various encapsulations of this method in R. See, e.g., > "reference classes" or the "proto" package. I can't see a reference-class implementation, but I did find https://stat.ethz.ch/pipermail/r-help/2010-March/230353.html (slightly edited) > [Subject:] [R] Stack type > [From:] Gabor Grothendieck ggrothendieck at gmail.com > [Date:] Tue Mar 2 14:33:43 CET 2010 > library(proto) > Stack <- proto(new = function(.) proto(Stack, > stack = NULL, > push = function(., el) { .$stack <- c(list(el), .$stack) }, > pop = function(.) { stopifnot(length(.$stack) > 0) > out <- .$stack[[1]] > .$stack[[1]] <- NULL > out > })) > mystack <- Stack$new() > mystack$push( 1 ) > mystack$push( letters ) > mystack$pop() > mystack$pop() > mystack$pop() # gives an error Thanks again! Tom Roche <tom_ro...@pobox.com> ______________________________________________ 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.