A function looks up free variables in the environment in which the function
was defined, not in the environment in which the function was called.  The
latter is called something like 'dynamic scoping' and usually leads to trouble,
the former is 'lexical scoping' and leads to predictable results.  You can do
dynamic scoping in R (using get(), assign(), and parent.frame()), but it
leads to code that only works correctly in favorable circumstances.  You should 
pass
data from the caller to the callee via the argument list, not via free 
variables.

To use lexical scoping define your functions as:

outerfunction<-function()
{
     middlefunction<-function()
     {
          innerfunction<-function()
          {
              print(paste(a, " from inner function"))
              print(paste(b, " from inner function"))
              # setwd(wd) # wd was not defined in your mail
        }
        b="b"
        print(paste(b, " from middle function"))
        innerfunction()
     }
     a="a"
     print(paste(a," from outer function"))
     middlefunction()
}

> outerfunction()
[1] "a  from outer function"
[1] "b  from middle function"
[1] "a  from inner function"
[1] "b  from inner function"

(One can change the environment of a function after it is defined, but
there is not often a need to do that.)

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com


> -----Original Message-----
> From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org] On 
> Behalf
> Of Rik Verdonck
> Sent: Wednesday, June 12, 2013 10:42 AM
> To: r-help@r-project.org
> Subject: [R] Functions within functions - environments
> 
> Dear list,
> 
> 
> I have a problem with nested functions and I don't manage to get it
> solved. I know I should be looking in environments, and I have tried a
> lot, but it keeps on erroring.
> An easy version of the problem is as follows:
> 
> 
> 
> innerfunction<-function()
> {
>     print(paste(a, " from inner function"))
>     print(paste(b, " from inner function"))
>     setwd(wd)
> }
> 
> 
> middlefunction<-function()
> {
>     b="b"
>     print(paste(b, " from middle function"))
>     innerfunction()
> }
> 
> 
> outerfunction<-function()
> {
>     a="a"
>     print(paste(a," from outer function"))
>     middlefunction()
> }
> 
> outerfunction()
> 
> 
> 
> Here, R will tell me that the inner function has no clue what a or b is.
> So what I want, is the inner function to recognize a and b.
> Any suggestions?
> 
> Many thanks!
> Rik
> 
> 
> 
> 
> --
> ________________________________________________
> 
> Rik Verdonck
> 
> 
> 
> Research group of Molecular Developmental Physiology and Signal
> Transduction
> KULeuven, Faculty of Science
> Naamsestraat 59,  Bus 02465
> B-3000 Leuven,Belgium
> Tel. +32 16 32 39 65
> Fax +32 16 32 39 02
> 
> http://bio.kuleuven.be/df/JV/index2.htm
> rik.verdo...@bio.kuleuven.be
> 
> 
> 
> 
> 
>       Please consider the environment before printing this e-mail
> 
>       [[alternative HTML version deleted]]
> 
> ______________________________________________
> 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.

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

Reply via email to