[R] Question about expression parser for "return" statement

Jeff Newmiller jdnewmil at dcn.davis.ca.us
Mon Nov 14 18:57:45 CET 2016


Sorry, I missed the operation-after-function call aspect of the OP question.

However, I think my policy of avoiding the return function as much as possible serves as an effective antibugging strategy for this problem, in addition to its other benefits.
-- 
Sent from my phone. Please excuse my brevity.

On November 14, 2016 2:12:49 AM PST, Duncan Murdoch <murdoch.duncan at gmail.com> wrote:
>On 13/11/2016 9:42 PM, Jeff Newmiller wrote:
>> I find your response here inconsistent... either including `return`
>causes a "wasted" function call to occur (same result achieved slower)
>or the parser has an optimization in it to prevent the wasted function
>call (only behaviorally the same).
>
>I don't understand what you are finding inconsistent.  I wasn't talking
>
>about wasting anything.  I was just saying that expressions like
>
>return (a)*b
>
>are evaluated by calling return(a) first, because return() is a 
>function, and then they'll never get to the multiplication.
>
>BTW, there don't appear to be many instances of this particular bug in 
>CRAN packages, though I don't have a reliable test for it yet.  The
>most 
>common error seems to be using just "return", as mentioned before.  The
>
>fix for that is to add parens, e.g. "return()".  The next most common
>is 
>something like
>
>invisible(return(x))
>
>which returns x before making it invisible.  The fix for this is to use
>
>return(invisible(x))
>
>
>> I carefully avoid using the return function in R. Both because using
>it before the end of a function usually makes the logic harder to
>follow and because I am under the impression that using it at the end
>of the function is a small but pointless waste of CPU cycles. That some
>people might be prone to writing a C-like use of "return;" which causes
>a function object to be returned only increases my aversion to using
>it.
>
>Sometimes it is fine to use return(x), but it shouldn't be used
>routinely.
>
>Duncan Murdoch
>
>> -- Sent from my phone. Please excuse my brevity. On November 13, 2016
>> 3:47:10 AM PST, Duncan Murdoch <murdoch.duncan at gmail.com> wrote:
>>> >On 13/11/2016 12:50 AM, Dave DeBarr wrote:
>>>> >> I've noticed that if I don't include parentheses around the
>intended
>>> >return
>>>> >> value for the "return" statement, R will assume the first
>>> >parenthetical
>>>> >> expression is the intended return value ... even if that
>>> >parenthetical
>>>> >> expression is only part of a larger expression.
>>>> >>
>>>> >> Is this intentional?
>>> >
>>> >Yes, return is just a function call that has side effects.  As far
>as
>>> >the parser is concerned,
>>> >
>>> >return ((1/sqrt(2*pi*Variance))*exp(-(1/2)*((x -
>Mean)^2)/Variance))
>>> >
>>> >is basically the same as
>>> >
>>> >f((1/sqrt(2*pi*Variance))*exp(-(1/2)*((x - Mean)^2)/Variance))
>>> >
>>> >Duncan Murdoch



More information about the R-help mailing list