From: Mark Wardle <mark_at_wardle.org>

Date: Tue 03 Apr 2007 - 09:00:09 GMT

}

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.

(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.

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

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 forthis 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.
*