Re: R-beta: Re: S Compatibility

Kurt Hornik (Kurt.Hornik@ci.tuwien.ac.at)
Wed, 30 Apr 1997 10:23:14 +0200


Date: Wed, 30 Apr 1997 10:23:14 +0200
Message-Id: <199704300823.KAA17738@aragorn.ci.tuwien.ac.at>
From: Kurt Hornik <Kurt.Hornik@ci.tuwien.ac.at>
To: Bill Venables <wvenable@attunga.stats.adelaide.edu.au>
Subject: Re:  R-beta: Re: S Compatibility
In-Reply-To: <9704300742.AA17932@attunga.stats.adelaide.edu.au>
 <9704300742.AA17932@attunga.stats.adelaide.edu.au>

>>>>> Bill Venables writes:

> Ross Ihaka writes:
>> Bill Venables writes:
>> 
>> > Are the scoping differences between R and S set out precisely and
>> > definitively somewhere?  This would be useful.
>> 
>> In the source code perhaps? :-)

> I should have added `concisely' ...

>> You can find a pretty precise description in the article Robert and I
>> did in JCGS.  

> May I suggest the reference be added to the FAQ if it is not
> already there?  It may not actually be a frequently asked
> question, but it should be.

Actually, the FAQ spends quite some time on this issue:

  Whereas the developers of R have tried to stick to the S language as
  defined in ``The New S Language'' (Blue Book, see question ``What is
  S?''), they have adopted the evaluation model of Scheme.

  This difference becomes manifest when free variables occur in a
  function.  Free variables are those which are neither formal
  parameters (occurring in the argument list of the function) nor local
  variables (created by assigning to them in the body of the function).
  Whereas S (like C) by default uses static scoping, R (like Scheme) has
  adopted lexical scoping.  This means the values of free variables are
  determined by a set of global variables in S, but in R by the bindings
  that were in effect at the time the function was created.

  Consider the following function:

       cube <- function(n) {
         sq <- function() n * n
         n * sq()
       }

  Under S, sq() does not ``know'' about the variable n unless it is
  defined globally:

       S> cube(2)
       Error in sq():  Object "n" not found
       Dumped
       S> n <- 3
       S> cube(2)
       [1] 18

  In R, the ``environment'' created when cube() was invoked is also
  looked in:

       R> cube(2)
       [1] 8

  Lexical scoping allows using function closures and maintaining local
  state.  A simple example (taken from Abelson and Sussman) can be found
  in the `demos/language' subdirectory of the R distribution.  Further
  information is provided in the standard R reference ``R: A Language
  for Data Analysis and Graphics'' (see question ``Which Documentation
  Exists for R?'') and a paper on ``Lexical Scope and Statistical
  Computing'' by Robert Gentleman and Ross Ihaka which can be obtained
  from the `doc/misc' directory of a CRAN site.

-k
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
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@stat.math.ethz.ch
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=