[Rd] Wish there were a "strict mode" for R interpreter. What about You?
Spencer Graves
spencer.graves at structuremonitoring.com
Sun Apr 10 16:18:28 CEST 2011
On 4/10/2011 6:10 AM, Duncan Murdoch wrote:
> On 11-04-09 9:22 PM, Spencer Graves wrote:
>> On 4/9/2011 6:12 PM, Duncan Murdoch wrote:
>>> On 11-04-09 7:02 PM, Spencer Graves wrote:
>>>> On 4/9/2011 2:31 PM, Hadley Wickham wrote:
>>>>> On Sat, Apr 9, 2011 at 2:51 PM, Paul Johnson<pauljohn32 at gmail.com>
>>>>> wrote:
>>>>>> Years ago, I did lots of Perl programming. Perl will let you be lazy
>>>>>> and write functions that refer to undefined variables (like R does),
>>>>>> but there is also a strict mode so the interpreter will block
>>>>>> anything
>>>>>> when a variable is mentioned that has not been defined. I wish there
>>>>>> were a strict mode for checking R functions.
>>>>>>
>>>>>> Here's why. We have a lot of students writing R functions around
>>>>>> here
>>>>>> and they run into trouble because they use the same name for things
>>>>>> inside and outside of functions. When they call functions that have
>>>>>> mistaken or undefined references to names that they use elsewhere,
>>>>>> then variables that are in the environment are accidentally used.
>>>>>> Know
>>>>>> what I mean?
>>>>>>
>>>>>> dat<- whatever
>>>>>>
>>>>>> someNewFunction<- function(z, w){
>>>>>> #do something with z and w and create a new "dat"
>>>>>> # but forget to name it "dat"
>>>>>> lm (y, x, data=dat)
>>>>>> # lm just used wrong data
>>>>>> }
>>>>>>
>>>>>> I wish R had a strict mode to return an error in that case. Users
>>>>>> don't realize they are getting nonsense because R finds things to
>>>>>> fill
>>>>>> in for their mistakes.
>>>>>>
>>>>>> Is this possible? Does anybody agree it would be good?
>>>>>
>>>>>> library(codetools)
>>>>>> checkUsage(someNewFunction)
>>>>> <anonymous>: no visible binding for global variable ‘y’
>>>>> <anonymous>: no visible binding for global variable ‘x’
>>>>> <anonymous>: no visible binding for global variable ‘dat’
>>>>>
>>>>> Which also picks up another bug in your function ;)
>>>>
>>>> Is this run by "R CMD check"? I've seen this message.
>>>>
>>>>
>>>> "R CMD check" will give this message sometimes when I
>>>> don't feel
>>>> it's appropriate. For example, I define a data object ETB in a
>>>> package,
>>>> then give that as the default in a function call like
>>>> f(data.=ETB){if(missing(data.))data(ETB); data.}. When I run "R CMD
>>>> check", I get "no visible binding for global variable 'ETB'", even
>>>> though the function is tested and works during R CMD check.
>>>
>>> What is ETB? Your code is looking for a global variable by that name,
>>> and that's what codetools is telling you.
>>
>> Duncan: Thanks for the question.
>>
>>
>> ETB is a data object in my package. codetools can't find it because
>> data(ETB) is needed before ETB becomes available. codetools is not
>> smart enough to check to see if ETB is a data object in the package.
>
> Okay, I understand what you are trying to do. Yes, you have fooled
> codetools in this instance.
I'm sorry: I did not intend to fool codetools. ;-)
I just wanted to provide sensible defaults in a way that seemed
obvious to me.
Thanks again for all your work on Rtools and the R project more
generally. Spencer
>
> Duncan Murdoch
>
--
Spencer Graves, PE, PhD
President and Chief Operating Officer
Structure Inspection and Monitoring, Inc.
751 Emerson Ct.
San José, CA 95126
ph: 408-655-4567
More information about the R-devel
mailing list