[Rd] return (x+1) * 1000

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Sat Nov 21 01:43:49 CET 2020


On 20/11/2020 7:01 p.m., Ben Bolker wrote:
>    I may be unusual but I don't find these examples surprising at all/
> I don't think I would make these mistakes (maybe it's easier to make
> that mistake if you're used to a language where 'return' is a keyword
> rather than a function?
> 
>     My two cents would be that it would make more sense to (1) write
> code to detect these constructions in existing R code (I'm not good at
> this, but presumably "return() as anything other than the head of an
> element of the body of a function" would work?)

No, it's commonly nested within an if() expression, and could appear 
anywhere else.

  (2) apply it to some
> corpus of R code to see whether it actually happens much; 

I did that, in the bug report #17180 I cited.  In 2016 it appeared to be 
misused in about 100 packages.

(3) if so,
> add the test you wrote in step 1 to the QA tools in the utils
> package/CRAN checks.

That was done this year.

Duncan Murdoch

> 
> On Fri, Nov 20, 2020 at 6:58 PM Henrik Bengtsson
> <henrik.bengtsson using gmail.com> wrote:
>>
>> Without having dug into the details, it could be that one could update
>> the parser by making a 'return' a keyword and require it to be
>> followed by a parenthesis that optionally contains an expression
>> followed by end of statement (newline or semicolon).  Such a
>> "promotion" of the 'return' statement seems backward compatible and
>> would end up throwing syntax errors on:
>>
>> function() return
>> function() return 2*x
>> function() return (2*x) + 1
>>
>> while still accepting:
>>
>> function() return()
>> function() return(2*x)
>> function() return((2*x) + 1)
>>
>> Just my two Friday cents
>>
>> /Henrik
>>
>> On Fri, Nov 20, 2020 at 3:37 PM Dénes Tóth <toth.denes using kogentum.hu> wrote:
>>>
>>> Yes, the behaviour of return() is absolutely consistent. I am wondering
>>> though how many experienced R developers would predict the correct
>>> return value just by looking at those code snippets.
>>>
>>> On 11/21/20 12:33 AM, Gabriel Becker wrote:
>>>> And the related:
>>>>
>>>>      > f = function() stop(return("lol"))
>>>>
>>>>      > f()
>>>>
>>>>      [1] "lol"
>>>>
>>>>
>>>> I have a feeling all of this is just return() performing correctly
>>>> though. If there are already R CMD CHECK checks for this kind of thing
>>>> (I wasnt sure but I'm hearing from others there may be/are) that may be
>>>> (and/or may need to be) sufficient.
>>>>
>>>> ~G
>>>>
>>>> On Fri, Nov 20, 2020 at 3:27 PM Dénes Tóth <toth.denes using kogentum.hu
>>>> <mailto:toth.denes using kogentum.hu>> wrote:
>>>>
>>>>      Or even more illustratively:
>>>>
>>>>      uneval_after_return <- function(x) {
>>>>          return(x) * stop("Not evaluated")
>>>>      }
>>>>      uneval_after_return(1)
>>>>      # [1] 1
>>>>
>>>>      On 11/20/20 10:12 PM, Mateo Obregón wrote:
>>>>       > Dear r-developers-
>>>>       >
>>>>       > After many years of using and coding in R and other languages, I
>>>>      came across
>>>>       > something that I think should be flagged by the parser:
>>>>       >
>>>>       > bug <- function (x) {
>>>>       >       return (x + 1) * 1000
>>>>       > }
>>>>       >> bug(1)
>>>>       > [1] 2
>>>>       >
>>>>       > The return() call is not like any other function call that
>>>>      returns a value to
>>>>       > the point where it was called from. I think this should
>>>>      straightforwardly be
>>>>       > handled in the parser by flagging it as a syntactic error.
>>>>       >
>>>>       > Thoughts?
>>>>       >
>>>>       > Mateo.
>>>>       > --
>>>>       > Mateo Obregón.
>>>>       >
>>>>       > ______________________________________________
>>>>       > R-devel using r-project.org <mailto:R-devel using r-project.org> mailing list
>>>>       > https://stat.ethz.ch/mailman/listinfo/r-devel
>>>>       >
>>>>
>>>>      ______________________________________________
>>>>      R-devel using r-project.org <mailto:R-devel using r-project.org> mailing list
>>>>      https://stat.ethz.ch/mailman/listinfo/r-devel
>>>>
>>>
>>> ______________________________________________
>>> R-devel using r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>> ______________________________________________
>> R-devel using r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
> 
> ______________________________________________
> R-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>



More information about the R-devel mailing list