[R] static vs. lexical scope
Duncan Murdoch
murdoch@dunc@n @end|ng |rom gm@||@com
Thu Sep 26 16:58:57 CEST 2019
On 26/09/2019 9:44 a.m., Richard O'Keefe wrote:
> 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.
This is all pretty clear: in the first assignment, x is found in the
global environment, because it does not exist in the evaluation frame.
In the second assignment, a new variable is created in the evaluation
frame. In the third assignment, that new variable is used to set the
value of b.
> 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.
It's definitely hard to compile R because of the scoping rules, but that
doesn't make the scoping rules unclear.
> 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.
I think the specification is really pretty simple. I'm not sure it is
well documented anywhere, but I think I understand it pretty well, and
it doesn't seem overly complicated to me.
> So while R's scoping is *like* lexical scoping, it is *dynamic* lexical
> scoping, to coin a phrase.
I'd say it is regular lexical scoping but with dynamic variable
creation. Call that dynamic lexical scoping if you want, but it's not
really a mystery.
Duncan Murdoch
>
> 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.
>
> ______________________________________________
> 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