[R] static vs. lexical scope

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Thu Sep 26 18:59:58 CEST 2019


On 26/09/2019 12:14 p.m., William Michels wrote:
> The best summary I've read on the subject of R's scoping rules (in
> particular how they compare to scoping rules in S-PLUS) is Dr. John
> Fox's "Frames, Environments, and Scope in R and S-PLUS", written as an
> Appendix to the first edition of his book, An R and S-PLUS Companion
> to Applied Regression (2002).

That's a nice comparison of the two systems.  I'm not so sure it's the 
best place to go for people who are only interested in R scoping, 
because some choice of terminology conflicts with standard usage in R 
(I'm thinking "environment" in particular), and this could end up 
confusing users who don't need the more general overview.

I think Hadley's description in Advanced R (online here: 
https://adv-r.hadley.nz/functions.html#lexical-scoping) is a pretty 
clear description of how R works.

Duncan Murdoch
	
> 
> In this document Dr. Fox refers to "lexical" scoping primarily,
> however where "static" scoping is mentioned, it is defined as
> equivalent to "lexical" scoping. The Appendix is available as a PDF
> from:
> 
> https://socialsciences.mcmaster.ca/jfox/Books/Companion-1E/appendix-scope.pdf
> 
> HTH, Bill.
> 
> W. Michels, Ph.D.
> 
> 
> 
> On Thu, Sep 26, 2019 at 7:59 AM Duncan Murdoch <murdoch.duncan using gmail.com> wrote:
>>
>> 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.
>>>
>>
>> ______________________________________________
>> 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