[R] Trying to learn how to write a function... can't define a variable??

David Winsemius dwinsemius at comcast.net
Fri Sep 7 22:34:32 CEST 2012


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




More information about the R-help mailing list