[R] Question about expression parser for "return" statement
Duncan Murdoch
murdoch.duncan at gmail.com
Mon Nov 14 18:22:31 CET 2016
On 14/11/2016 11:26 AM, Wolf, Steven wrote:
> Just to add on a bit, please note that the return is superfluous. If
> you write this:
>
> normalDensityFunction = function(x, Mean, Variance) {
> # no "return" value given at all
> (1/sqrt(2*pi*Variance))*exp(-(1/2)*((x - Mean)^2)/Variance)
> }
> normalDensityFunction(2,0,1)
>
> ...you get the right answer again.
>
> This is not "best practices", and Duncan will probably give you 10
> reasons why you should never do it this way. But if the parentheses
> behavior bothers you enough, you can subvert it. This probably won't
> work so well if you try to make any more complicated output.
Why do you say that's not best practice? I would say that's preferable
to an explicit return().
Duncan
>
> Caveat Emptor.
>
> -SW
>
> --
> Steven Wolf, PhD
> Assistant Professor
> Department of Physics
> STEM CoRE -- STEM Collaborative for Research in Education
> http://www.ecu.edu/cs-acad/aa/StemCore
> East Carolina University
> Phone: 252-737-5229
>
>
>
> On Sun, 2016-11-13 at 13:35 -0500, Duncan Murdoch wrote:
>> On 13/11/2016 7:58 AM, Duncan Murdoch wrote:
>>> On 13/11/2016 6:47 AM, Duncan Murdoch 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))
>>> By the way, out of curiosity I took a look at the source of CRAN
>>> packages to see if this actually occurs. It turns out that "return"
>>> is used as a variable name often enough to make automatic tests
>>> tricky, so I don't know the answer to my question. However, I did
>>> turn up a number of cases where people have code like this: if (name
>>> == "") return; (from the bio.infer package), which never calls
>>> return(), so doesn't actually do what the author likely intended
>>
>>
>> I searched the R sources and the sources of CRAN packages, and found
>> this is a reasonably common problem: it's in 111 packages, including
>> one in base R. I'll be emailing the maintainers to let them know.
>>
>> I'll see about putting a check for this into R CMD check.
>>
>> Duncan Murdoch
>>
>>
More information about the R-help
mailing list