On Sep 7, 2012, at 1:34 PM, David Winsemius wrote: > > 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
I meant to write "x+1" ^^^ (aka: failure to shift) > 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 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.