Dave DeBarr
2016-Nov-13 05:50 UTC
[R] Question about expression parser for "return" statement
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? 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]]
Duncan Murdoch
2016-Nov-13 11:47 UTC
[R] Question about expression parser for "return" statement
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> > 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 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. >> >
Jeff Newmiller
2016-Nov-14 02:42 UTC
[R] Question about expression parser for "return" statement
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 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. -- 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 > >> >> 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. >> > >______________________________________________ >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.