[R] Lexical scoping is not what I expect

Duncan Murdoch murdoch.duncan at gmail.com
Thu Jun 27 14:24:21 CEST 2013


On 13-06-27 8:18 AM, Terry Therneau wrote:
> I second Ellison sentiments of "almost never".  One main reason is readability on later
> viewing.
> Yes, as Duncan says global variables can sometimes be handy and make functions quick to
> write, but using a formal argument in the call is always clearer.

I didn't say that.  I said that in most cases global variables other 
than functions should not be used.

I would generalize that a little:  global constants are okay, changing 
globals is usually a bad idea.

Duncan Murdoch


>
> Terry Therneau
>
> On 06/27/2013 05:00 AM, r-help-request at r-project.org wrote:
>> On 13-06-26 6:57 AM, S Ellison wrote:
>>>>
>>>>
>>>>>>   -----Original Message-----
>>>>>>   It may be helpful not to worry about the technical details,
>>>>>>   just to look at the source code defining the function:  if it
>>>>>>   is defined in a place where a variable can be seen, it can
>>>>>>   see that variable.
>>>>
>>>>   I too find R's lexical scoping rules straightforward.
>>>>   However, I'd say that if your code relies on lexical scoping to find something, you should probably rewrite your code.
>>>>
>>>>   The number of times I've seen new R users get unexpected results because they haven't noticed that their function is referencing a parent environment instead of a locally defined variable or argument is past counting.
>>>>
>>>>   Of course there are times when it's useful and sensible to have globally defined variables that can be accessed within a function. But they are very rare; as a default, I'd recommend avoiding it if at all possible. If your function needs something from outside, pass it as an argument.
>>>>
>> I would say the meaning of "probably" in your 2nd sentence depends quite
>> a bit on the user.  For beginners, it's "almost certainly".  For people
>> who are comfortable with the concept, it's just "maybe".
>>
>> I would agree that in most cases the only global objects that functions
>> should reference are other functions, but small nested functions are
>> quite safe, and it's sometimes useful to create functions in a local
>> environment so they have persistent memory.
>>
>> Duncan Murdoch
>>



More information about the R-help mailing list