Re: [R] (Newbie)Basic Basic global vs. local variables

From: Mark Wardle <mark_at_wardle.org>
Date: Tue 03 Apr 2007 - 09:00:09 GMT

projection83 wrote:
> My R code has got too complex to have a non-modular approach. Ive done some
> coding in other languages before, but I somehow cant figure out R's general
> rules for global and local variables. I have put a simple code below, if
> anyone can show me what i need to add to make this work, i would greatly
> appreciate it!
>
> #----------------------------------------
> g_Means<-numeric()
>
> defineSamples<- function()
> {
> g_Means<-5
> }
>
> runit<-function()
> {
> defineSamples()
> g_Means #####<<This returns "numeric(0)", and not "5"
> }
>
> runit()
> #----------------------------
> Basically I can not get the parameter I set from a global scale...

I don't think you quite understand variable scope.

The "Introduction to R" says:

(http://cran.r-project.org/doc/manuals/R-intro.html#Assignment-within-functions)

> 10.5 Assignments within functions
>
> Note that any ordinary assignments done within the function are local and temporary and are lost after exit from the function. Thus the assignment X <- qr(X) does not affect the value of the argument in the calling program.
>
> To understand completely the rules governing the scope of R assignments the reader needs to be familiar with the notion of an evaluation frame. This is a somewhat advanced, though hardly difficult, topic and is not covered further here.
>
> If global and permanent assignments are intended within a function, then either the “superassignment” operator, <<- or the function assign() can be used. See the help document for details. S-Plus users should be aware that <<- has different semantics in R. These are discussed further in Scope.

I've struggled with keeping my global namespace relatively clutter-free.  You should think of functions as separate pieces of work, independent from most other things, and try to design them to be as generic as possible.

Presumably defineSamples() does some complex calculations, although it is impossible to tell as it appears to not take any parameters, and returns the value of g_Means (functions return their last evaluated expression).

Therefore your runIt() function isn't actually getting the result.

I would suggest defining functions with well-defined inputs and outputs, and NOT using global variables. It is difficult to give examples as you haven't said what your functions are doing, but for example:

defineSamples <- function(a,b,c=TRUE) {

	# do some complex things with our input variables
	# and return the results  - let's make it explicit with a return() call
	return(a*b)

}

This is an isolated piece of logic, and if you go and change things elsewhere, its functionality won't have to be changed.

# note that this doesn't take any parameters. runIt <- function() {

	my.result = defineSamples(3,4)
	return(my.results)		# superfluous, but nice to make it explicit for
this example
}

Then you can call

runIt()
=> gives 12

And if you want to save the result, use

g_Means = runIt()

You can pass arbitrarily complex data structures from and to functions if you have the need - see list().

Hope this helps,

Mark

-- 
Dr. Mark Wardle
Specialist registrar, Neurology
Cardiff, UK

______________________________________________
R-help@stat.math.ethz.ch 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.
Received on Tue Apr 03 19:07:32 2007

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Wed 04 Apr 2007 - 04:30:54 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.