On Mon, Jul 25, 2011 at 4:14 AM, Noah Silverman <noahsilver...@ucla.edu> wrote: > Hi, > > I'm working on coding some more complex things in R and have need to break > much of the logic into functions. > > I have several "global" variables that I want to change with a given > function. (The variable has a different value after the function is called.) > > In other languages like C, this is simple. However, in R, if a function > changes a variable, that change only occurs in the frame of that function. > So, when the function returns, the old value is still there. > > Of course, I could just have the function return the value, but some > functions change 5-6 variables. So, I could have a function return a list, > and then parse that list every time, but that seems like an excessive amount > of overhead. (Especially as some functions may be called many many times.) > > How have some of you handled this? Is there a "best practices" way? >
Usually I would handle this by returning a list. It's not that much overhead. If you have a set of functions that share variables (like a C static variable) you can use lexical scope and <<- to make changes. The demos in the tcltk package do this. You can also use a scratchpad environment and pass it around. Since environments are passed by references, changes made to that environment inside a function will stay changed. e<-new.env() e$storage<-0 f<-function(i, scratchpad){ scratchpad$storage<-scratchpad$storage+i scratchpad$storage } g<-function(i, scratchpad){ scratchpad$storage<-scratchpad$storage-i scratchpad$storage } f(1,e) g(2,e) f(3,e) g(4,e) -thomas -- Thomas Lumley Professor of Biostatistics University of Auckland ______________________________________________ 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.