[R] (Newbie)Basic Basic global vs. local variables
projection83
mkurowski at gmail.com
Wed Apr 4 05:45:33 CEST 2007
Thank you,
I will give this a good think
Mark Wardle wrote:
>
> 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 at 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.
>
>
--
View this message in context: http://www.nabble.com/%28Newbie%29Basic-Basic-global-vs.-local-variables-tf3503101.html#a9830501
Sent from the R help mailing list archive at Nabble.com.
More information about the R-help
mailing list