Implementing Push and Pop in R
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Having grown up with Perl, there are two functions that I desperately miss while programming in R: push and pop. Continually writing
1 | vector <- c(vector, new.entry) |
tries my patience, while writing
1 2 | vector <- rep(NA, inscrutable.constant) vector[inscrutable.index] <- new.entry |
makes me feel like I’m programming in C, rather than a higher-level programming language. That said, here’s a simplistic hack to provide something like an implementation of push and pop in R:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | push <- function(vector.name, item)
{
eval.parent(parse(text = paste(vector.name, ' <- c(', vector.name, ', ', item, ')',
sep = '')),
n = 1)
}
pop <- function(vector.name)
{
eval.parent(parse(text = paste(vector.name, ' <- ',
vector.name, '[-length(', vector.name, ')]',
sep = '')),
n = 1)
} |
Both of these functions are more than a little ugly, because you have to pass in a string that names the vector you want to change, rather than providing its name as a bareword. Even worse, this version of pop doesn’t let you get the value of the item you pop off of the stack, because I’m not sure how to introduce a temporary variable into the parent’s environment without occasionally clobbering the value of an existing variable. If I knew more about scoping and lazy evaluation in R, I think I could implement these two functions as pseudo-macros and solve both concerns. If you know how to do this, please do let me know.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.