Accessing a function's environment

Peter Dalgaard BSA p.dalgaard@biostat.ku.dk
15 Jun 1999 23:28:14 +0200


Douglas Bates <bates@stat.wisc.edu> writes:

>  > Fact <- mkFact()
>  > Fact         # the actual factorial function with an environment
>  function (n) 
>  {
>      nm <- paste(".", n, sep = "/")
>      if (n <= 0) 
> 	 return(1)
>      if (exists(nm, envir = .env)) 
> 	 return(get(nm, envir = .env))
>      ans <- n * Recall(n - 1)
>      assign(nm, ans, envir = .env)
>      ans
>  }
>  <environment: 0x406136e0>
>  > Fact(4)
>  [1] 24
>  > objects(env = environment(Fact), all = TRUE)
>  [1] "./1"  "./2"  "./3"  "./4"  ".env"
>  > Fact(6)
>  [1] 720
>  > objects(env = environment(Fact), all = TRUE)
>  [1] "./1"  "./2"  "./3"  "./4"  "./5"  "./6"  ".env"
> 
> If you use debug(Fact) and check what happens when Fact(6) is
> evaluated, you will see that by the time it evaluates Fact(4), it
> picks up the result from the environment.

Or (0.65 only):

> Fact<-local({
+   .env<-environment()
+   f<-function(n){     
+     nm <- paste(".", n, sep = "/")
+     if (n <= 0)
+       return(1)
+     if (exists(nm, envir = .env))
+       return(get(nm, envir = .env))
+     ans<-n*f(n-1)
+     assign(nm,ans,envir=.env)
+     ans
+   }
+ })
> Fact(6)
[1] 720
> objects(env = environment(Fact), all = TRUE)
[1] "./1"  "./2"  "./3"  "./4"  "./5"  "./6"  ".env" "f"   


-- 
   O__  ---- Peter Dalgaard             Blegdamsvej 3  
  c/ /'_ --- Dept. of Biostatistics     2200 Cph. N   
 (*) \(*) -- University of Copenhagen   Denmark      Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard@biostat.ku.dk)             FAX: (+45) 35327907
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._