Martin Maechler
2017-Aug-23 07:17 UTC
[Rd] Possible repeat{} / break function bug in R 3.4.1
>>>>> 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 -------------- next part -------------- An embedded and charset-unspecified text was scrubbed... Name: breakTest.R URL: <https://stat.ethz.ch/pipermail/r-devel/attachments/20170823/9ee1b2d7/attachment.ksh> -------------- next part -------------- An embedded and charset-unspecified text was scrubbed... Name: break-source_R341.R URL: <https://stat.ethz.ch/pipermail/r-devel/attachments/20170823/9ee1b2d7/attachment-0001.ksh>
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
Tomas Kalibera
2017-Aug-23 07:24 UTC
[Rd] Possible repeat{} / break function bug in R 3.4.1
It is a bug in the byte-code compiler. I will fix Tomas On 08/23/2017 09:22 AM, Lionel Henry wrote:> 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 > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel