Duncan Murdoch
2016-Nov-13 12:58 UTC
[R] Question about expression parser for "return" statement
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. Duncan Murdoch> > Duncan Murdoch > >> >> I'm guessing it is intentional; but since there is no warning about >> ignoring the rest of the expression, it could lead to hard-to-find bugs. >> >> Thanks, >> Dave >> >> Here's an example ... >> >> dnorm(2, 0, 1) >> normalDensityFunction = function(x, Mean, Variance) { >> # no parentheses surrounding the entire "return" value >> return (1/sqrt(2*pi*Variance))*exp(-(1/2)*((x - Mean)^2)/Variance) >> } >> normalDensityFunction(2, 0, 1) # incorrect answer >> normalDensityFunction = function(x, Mean, Variance) { >> # parentheses surrounding the entire "return" value >> return ((1/sqrt(2*pi*Variance))*exp(-(1/2)*((x - Mean)^2)/Variance)) >> } >> normalDensityFunction(2, 0, 1) # correct answer >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help at 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. >> >
Duncan Murdoch
2016-Nov-13 18:35 UTC
[R] Question about expression parser for "return" statement
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 intendedI 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
Wolf, Steven
2016-Nov-14 16:26 UTC
[R] Question about expression parser for "return" statement
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. 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 [[alternative HTML version deleted]]