On Sep 7, 2012, at 11:00 AM, wwreith wrote: > I am just starting to experiment with writing a function and have run into > what seems like a limitation or more likely a lack of understanding on my > part. > > Very Simple Example: I want to define a function that does 1+1=2. > > z<-1 > ADD<-function(x) > { > x<-x+1 > } > ADD(z) > z > output for z is 1 not the expected 2. > > Now if I were to do print(x+1) instead of x<-x+1 it does return 2, so the > function seems ok with x+1, but not ok with x<-. Is there a way to define a > variable inside a function or am I violating some rule that I don't know > about?
The rule you are violating is failing to assign the calculated value in the proper environment. The x=1 value exists inside the function and _is_ returned, but you didn't do anything with it, so it has no name and will get garbage collected. Here's an incrementer function that works: ADD <- function(x) assign( deparse(substitute(x)), x+1, envir=parent.frame() ) x=1 ADD(x) x #[1] 2 You could also have written it thusly: ADD <- function(x) x <<- x+1 ) (But that operator is frowned upon by those in the know.) I'm not sure what sort of reaction would be provoked by: ADD <- function(x) { eval.parent(substitute(x <- x + 1)) } The data.table package does in-memory alterations in its objects using a database model. It is often much faster than reassignment of dataframes to them self or even adding a columns, which does require making a copy (or maybe even two) of the entire object. -- David Winsemius, MD Alameda, CA, USA ______________________________________________ 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.