[R] Questions about lexical scope
Laurent Gautier
laurent at cbs.dtu.dk
Sat Aug 10 20:43:06 CEST 2002
As I was pointed out by Mr.R. himself(*), the call to
'cat' is done *before* the call to the function 'rule'
(hence the variable "count" should be zero... and
is zero...)
I should probably consider using bigger fonts (or bigger glasses)...
L.
(*): thanks Robert
On Sat, Aug 10, 2002 at 01:32:44PM +0200, Laurent Gautier wrote:
> Dear Joseph,
>
>
> Did you get any answer about your problem ?
>
> I have been toying with your examples and get a bit scared of what
> is happening with lexical scoping...
>
>
> I edited your function bv.integrate to have some informations about
> what was going on.
>
> bv.integrate <- function(f, a, b, n=100, rule=midpoint) {
> assign("count", 0, envir=.GlobalEnv)
> g <- function(y) {
> assign("count", get("count", envir=.GlobalEnv)+1, envir=.GlobalEnv
> fx <- function(x) f(x, y)
> rule(fx, a[2], b[2], n)
> }
> cat("# times in g:", get("count", envir=.GlobalEnv), "\n")
> rule(g, a[1], b[1])
> }
>
> my R sesssion gave the following:
>
> > bv.integrate(function(x, y) sin(x + y), c(0,0), c(1,1), rule=trapezoidal)
> # times in g: 0
> [1] 0.007080675
> > print(count)
> [1] 2
>
> > bv.integrate(function(x, y) sin(x + y), c(0,0), c(1,1), rule=midpoint)
> # times in g: 0
> [1] 0.773651
> > print(count)
> [1] 100
>
>
> For some reason the function 'g' defined in bv.integrate is applied only
> 2 times when the rule is trapezoidal and 100 times when the rule is
> midpoint (?!)... and the variable 'count' I defined in '.GlobalEnv' has
> different values (depending on whether I am in '.GlobalEnv' or in
> 'bv.integrate'....
>
>
> I must have missed something obvious somewhere... but where ?
>
>
>
>
> L.
>
>
>
>
>
> --
> --------------------------------------------------------------
> Laurent Gautier CBS, Building 208, DTU
> PhD. Student DK-2800 Lyngby,Denmark
> tel: +45 45 25 24 89 http://www.cbs.dtu.dk/laurent
>
>
>
>
> On Wed, Aug 07, 2002 at 12:28:28AM +0900, Lu Chi-Hsien Joseph wrote:
> > Dear R-users,
> >
> > The numerical integration example given in Gentleman and Ihaka (2000),
> > "Lexical Scope and Statistical Computing," JCGS, 9, 491-508,
> > is very interesting and helpful in understanding how lexical scope
> > is about.
> > However, I got some questions that I just can't figure out.
> > First all, allow me to copy the two functions given by the authors:
> >
> > midpoint <- function(f, a, b, n=100) {
> > h <- (b - a)/n
> > (b - a)*mean(sapply(seq(a + h/2, b - h/2, length=n), f))
> > }
> >
> > bv.integrate <- function(f, a, b, n=100, rule=midpoint) {
> > g <- function(y) {
> > fx <- function(x) f(x, y)
> > rule(fx, a[2], b[2], n)
> > }
> > rule(g, a[1], b[1])
> > }
> >
> > I modified the function name from "integrate" to "bv.integrate".
> > To integrate f(x,y)=sin(x + y) over the unit square,
> > it works:
> > > bv.integrate(function(x, y) sin(x + y), c(0,0), c(1,1))
> > [1] 0.773651
> > (compare with .7736445 calculated from 2sin(1)*(1 - cos(1)))
> >
> > Then I write a function using trapezoidal rule as follows:
> >
> > trapezoidal <- function(f, a, b, n=100) {
> > h <- (b - a)/n
> > i <- 1:n
> > sum(f(a + (i - 1)*h), f(a + i*h))*h/2
> > }
> >
> > I checked with
> > > trapezoidal(sin, 0, 1)
> > [1] 0.4596939
> > > 1 - cos(1)
> > [1] 0.4596977
> >
> > and
> > > trapezoidal(dnorm, -3, 3)
> > [1] 0.9972922
> > > diff(pnorm(c(-3, 3)))
> > [1] 0.9973002
> >
> > Then, this is what I got by plugged in "trapezoidal" for the "rule"
> > in bv.integrate():
> > > bv.integrate(function(x, y) sin(x + y), c(0,0), c(1,1), rule=trapezoidal)
> > [1] 0.007080675
> >
> > Hundred time smaller!
> > Answer can be "improved" by increasing n, but always 100 times smaller.
> >
> > Anything wrong with the way I wrote trapezoidal()?
> > I just can't figure out any difference, in terms of input/output,
> > between midpoint() and trapezoidal().
> >
> > Then I tried to use integrate() as the rule in bv.integrate(),
> > by defining a wrap-up function:
> >
> > intg <- function(f, a, b, n=100) integrate(f, a, b, n)$value
> >
> > to have the value as the only output.
> > But, I got
> > > bv.integrate(function(x, y) sin(x + y), c(0,0), c(1,1), rule=intg)
> > Error in integrate(f, a, b, n) : evaluation of function gave a result
> > of wrong length
> >
> > I tried to use debugger() to find out what's wrong,
> > but not succeeded.
> > There must be something I missed in understanding the lexical scope,
> > however, what's going on with the function I wrote?
> > What should be the way to correct them?
> >
> > Certainly, I know integrate() should be the one to use.
> > These are questions from my preparation of programming exercise
> > of using R in my statistical computation class.
> >
> > I'll be very appreciated for anyone who might help me on these
> > questions.
> >
> > Best regards,
> >
> > C. Joseph Lu
> > Department of Statistics
> > National Cheng-Kung University
> > Tainan, Taiwan, ROC
> > -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
> > r-help 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-help-request at stat.math.ethz.ch
> > _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
>
> -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
> r-help 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-help-request at stat.math.ethz.ch
> _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
--
--------------------------------------------------------------
Laurent Gautier CBS, Building 208, DTU
PhD. Student DK-2800 Lyngby,Denmark
tel: +45 45 25 24 89 http://www.cbs.dtu.dk/laurent
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help 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-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
More information about the R-help
mailing list