[R] static vs. lexical scope
Richard O'Keefe
r@oknz @end|ng |rom gm@||@com
Thu Sep 26 15:44:48 CEST 2019
Actually, R's scope rules are seriously weird.
I set out to write an R compiler, wow, >20 years ago.
Figured out how to handle optional and keyword parameters efficiently,
figured out a lot of other things, but choked on the scope rules.
Consider
> x <- 1
> f <- function () {
+ a <- x
+ x <- 2
+ b <- x
+ c(a=a, b=b)
+ }
> f()
a b
1 2
> x
[1] 1
It's really not clear what is going on here.
However, ?assign can introduce new variables into an environment,
and from something like
with(df, x*2-y)
it is impossible for a compiler to tell which, if either, of x and y is to
be obtained from df and which from outside. And of course ?with
is just a function:
> df <- data.frame(y=24)
> w <- with
> w(df, x*2-y)
[1] -22
So you cannot in general tell *which* function can twist the environment
in which its arguments will be evaluated.
I got very tired of trying to explore a twisty maze of documentation and
trying to infer a specification from examples. I would come up with an
ingenious mechanism for making the common case tolerable and the
rare cases possible, and then I'd discover a bear trap I hadn't seen.
I love R, but I try really hard not to be clever with it.
So while R's scoping is *like* lexical scoping, it is *dynamic* lexical
scoping, to coin a phrase.
On Thu, 26 Sep 2019 at 23:56, Martin Møller Skarbiniks Pedersen
<traxplayer using gmail.com> wrote:
>
> On Wed, 25 Sep 2019 at 11:03, Francesco Ariis <fa-ml using ariis.it> wrote:
> >
> > Dear R users/developers,
> > while ploughing through "An Introduction to R" [1], I found the
> > expression "static scope" (in contraposition to "lexical scope").
> >
> > I was a bit puzzled by the difference (since e.g. Wikipedia conflates the
> > two) until I found this document [2].
>
>
> I sometimes teach a little R, and they might ask about static/lexical scope.
> My short answer is normally that S uses static scoping and R uses
> lexical scoping.
> And most all modern languages uses lexical scoping.
> So if they know Java, C, C# etc. then the scoping rules for R are the same.
>
> I finally says that it is not a full answer but enough for most.
>
> Regards
> Martin
>
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> 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.
More information about the R-help
mailing list