[Rd] Possible repeat{} / break function bug in R 3.4.1

Lionel Henry lionel at rstudio.com
Wed Aug 23 09:22:24 CEST 2017


I don't think that's a bug. source() uses eval(), and eval() creates a
new function-like context frame. In a way expecting `break` to work
inside source() is like expecting `break` to cross stack frames:

    my_break <- function() break
    repeat(my_break())

Lionel


> On 23 août 2017, at 09:17, Martin Maechler <maechler at stat.math.ethz.ch> wrote:
> 
>>>>>> Martin Maechler <maechler at stat.math.ethz.ch>
>>>>>>    on Wed, 23 Aug 2017 09:10:20 +0200 writes:
> 
>>>>>> Peter Bosa <Peter.Bosa at oregonmetro.gov>
>>>>>>    on Tue, 22 Aug 2017 14:39:50 +0000 writes:
> 
>>> Hello, I've noticed the following error using repeat{} / break in R 3.4.1 running on Windows 10 and Windows Server 2008 (both 64-bit environments).
>>> When running a repeat function, the break command causes an error message if the repeat command refers to code within a file, but does not produce an error if the code is contained within the repeat{} command.
> 
>>> Hello, I've noticed the following error using repeat{} / break in R 3.4.1 running on Windows 10 and Windows Server 2008 (both 64-bit environments).
>>> 
>>> When running a repeat function, the break command causes an error message if the repeat command refers to code within a file, but does not produce an error if the code is contained within the repeat{} command.
>>> 
>>> For example, the following code runs fine:
>>> 
>>> x <- 1
>>> y <- 5
>>> 
>>> repeat {
>>> if(x < y) {
>>> print("No Break Dance :-(")
>>> x = x + 1
>>> } else {
>>> print("Break Dance!")
>>> break
>>> }
>>> }
>>> 
>>> [1] "No Break Dance :("
>>> [1] "No Break Dance :("
>>> [1] "No Break Dance :("
>>> [1] "No Break Dance :("
>>> [1] "No Break Dance :("
>>> [1] "Break Dance!"
>>>> 
>>> 
>>> However, if I take the loop contents of the repeat{} function, and save them to a file (breakTest.R) that contains the following:
>>> 
>>> if(x < y) {
>>> print("No Break Dance :-(")
>>> x = x + 1
>>> } else {
>>> print("Break Dance!")
>>> break
>>> }
>>> 
>>> And then run the following code:
>>> 
>>> x <- 1
>>> y <- 5
>>> 
>>> repeat{
>>> source("./breakTest.R")
>>> }
>>> 
>>> I get the following error:
>>> 
>>> [1] "No Break Dance :("
>>> [1] "No Break Dance :("
>>> [1] "No Break Dance :("
>>> [1] "No Break Dance :("
>>> [1] "No Break Dance :("
>>> [1] "Break Dance!"
>>> Error in eval(ei, envir) : no loop for break/next, jumping to top level
>>>> 
>>> 
>>> This was not an issue with previous versions of R that I have used, including 3.3.3.
>>> 
>>> Any suggestions? Is this a known bug with 3.4.1?
> 
>> Thank you, Peter!
> 
>> I can confirm what you are seeing (on Linux) in R version 3.4.0,
>> 3.4.1, and "R devel", and also that this had worked w/o a
>> problem in earlier versions of R, where I've looked at
>> R version 3.3.3 and 3.2.5.
> 
>> I do think this is a bug, but it was not known till now.
> 
>> For ease of use, I attach the two R files to easily reproduce.
>> Note I use  writeLines() instead of print() as its output is "nicer".
> 
>> Best regards,
>> Martin Maechler, ETH Zurich
> 
> Trying again with the two attachment.  Yes, I of all people (!!)
> should know that they must have an allowed MIME type; in this
> case  text/plain !
> 
> Martin
> 
> ## see ./break-source_R341.R
> if(x < y) {
>  writeLines("No Break Dance :-(")
>  x <- x + 1
> } else {
>  writeLines("Break Dance!")
>  break
> }
> ## From: Peter Bosa <Peter.Bosa at oregonmetro.gov>
> ## To: "R-devel at r-project.org" <R-devel at r-project.org>
> ## Subject: [Rd] Possible repeat{} / break function bug in R 3.4.1
> ## Date: Tue, 22 Aug 2017 14:39:50 +0000
> 
> ## Hello, I've noticed the following error using repeat{} / break in R 3.4.1 running on Windows 10 and Windows Server 2008 (both 64-bit environments).
> 
> ## When running a repeat function, the break command causes an error message if the repeat command refers to code within a file, but does not produce an error if the code is contained within the repeat{} command.
> 
> ## For example, the following code runs fine:
> 
> x <- 1
> y <- 5
> repeat {
>  if(x < y) {
>    writeLines("No Break Dance :-(")
>    x <- x + 1
>  } else {
>    writeLines("Break Dance!")
>    break
>  }
> }
> ## No Break Dance :(
> ## No Break Dance :(
> ## No Break Dance :(
> ## No Break Dance :(
> ## No Break Dance :(
> ## Break Dance!
> ## >
> 
> ## However, if I take the loop contents of the repeat{} function, and save
> ## them to a file (breakTest.R) that contains the following:
> ##                 ^^^^^^^^^^^
> ##                __SEE THAT FILE__
> ## if(x < y) {
> ##   writeLines("No Break Dance :-(")
> ##   x = x + 1
> ## } else {
> ##   writeLines("Break Dance!")
> ##   break
> ## }
> 
> ## And then run the following code:
> 
> x <- 1
> y <- 5
> repeat{
>  source("./breakTest.R")
> }
> cat("successfully finished\n")
> 
> ## I get the following error:
> 
> ## No Break Dance :(
> ## No Break Dance :(
> ## No Break Dance :(
> ## No Break Dance :(
> ## No Break Dance :(
> ## Break Dance!
> ## Error in eval(ei, envir) : no loop for break/next, jumping to top level
> ## ^^^^^^^^^^^^^^^^^^^^
> 
> 
> ## This was not an issue with previous versions of R that I have used, including 3.3.3.
> 
> ## MM: It does work in R 3.3.3, indeed
> ## --  it fails in R 3.4.0 and later
> 
> 
> ## Any suggestions? Is this a known bug with 3.4.1?
> 
> ## Cheers-
> ## Peter
> 
> 
> ## ----------------------------------------------------------------
> ## peter bosa
> ## metro
> ## modeling services
> ## 600 ne grand ave
> ## portland, or  97232
> 
> ## peter.bosa at oregonmetro.gov<mailto:peter.bosa at oregonmetro.gov>
> ## 503.797.1771
> 
> ## metro | making a great place
> ## www.oregonmetro.gov
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



More information about the R-devel mailing list