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 <maech...@stat.math.ethz.ch> wrote: > >>>>>> Martin Maechler <maech...@stat.math.ethz.ch> >>>>>> on Wed, 23 Aug 2017 09:10:20 +0200 writes: > >>>>>> Peter Bosa <peter.b...@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.b...@oregonmetro.gov> > ## To: "R-devel@r-project.org" <R-devel@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.b...@oregonmetro.gov<mailto:peter.b...@oregonmetro.gov> > ## 503.797.1771 > > ## metro | making a great place > ## www.oregonmetro.gov > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel