return can be used to set the return value of an expression evaluated by
"eval"
expr <- quote(if (x) return(1) else return(2))
x <- FALSE
eval(expr) #2
Tomas
On 08/23/2017 09:46 AM, Lionel Henry wrote:
oops, I should have tried it:
expr <- quote(break)
repeat(eval(expr))
So eval() has hybrid semantics where `break` has more reach than
return(), weird.
expr <- quote(return())
repeat(eval(expr)) # infloop
Lionel
On 23 août 2017, at 09:24, Tomas Kalibera <tomas.kalib...@gmail.com> wrote:
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 <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
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel