iuke-tier@ey m@iii@g oii uiow@@edu
2024-May-11 01:34 UTC
[Rd] [External] R hang/bug with circular references and promises
On Sat, 11 May 2024, Travers Ching wrote:> The following code snippet causes R to hang. This example might be a > bit contrived as I was experimenting and trying to understand > promises, but uses only base R. > > It looks like it is looking for "not_a_variable" recursively but since > it doesn't exist it goes on indefinitely. > > x0 <- new.env() > x1 <- new.env(parent = x0) > parent.env(x0) <- x1 > delayedAssign("v", not_a_variable, eval.env=x1) > delayedAssign("w", v, assign.env=x1, eval.env=x0) > x1$wThis has nothing to do with promises. You created a cycle in the environment chain. A simpler variant: e <- new.env() parent.env(e) <- e get("x", e) This will hang and is not interruptable -- loops searching up environment chains are too speed-critical to check for interrupts. It is, however, pretty easy to check whether the parent change would create a cycle and throw an error if it would. Need to think a bit about exactly where the check should go. Best, luke> > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel >-- Luke Tierney Ralph E. Wareham Professor of Mathematical Sciences University of Iowa Phone: 319-335-3386 Department of Statistics and Fax: 319-335-3017 Actuarial Science 241 Schaeffer Hall email: luke-tierney at uiowa.edu Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu/
Peter Langfelder
2024-May-11 15:03 UTC
[Rd] [External] R hang/bug with circular references and promises
On Sat, May 11, 2024 at 9:34?AM luke-tierney--- via R-devel <r-devel at r-project.org> wrote:> > On Sat, 11 May 2024, Travers Ching wrote: > > > The following code snippet causes R to hang. This example might be a > > bit contrived as I was experimenting and trying to understand > > promises, but uses only base R. > > This has nothing to do with promises. You created a cycle in the > environment chain. A simpler variant: > > e <- new.env() > parent.env(e) <- e > get("x", e) > > This will hang and is not interruptable -- loops searching up > environment chains are too speed-critical to check for interrupts. It > is, however, pretty easy to check whether the parent change would > create a cycle and throw an error if it would. Need to think a bit > about exactly where the check should go.FWIW, the help for parent.env already explicitly warns against using parent.env <-: The replacement function ?parent.env<-? is extremely dangerous as it can be used to destructively change environments in ways that violate assumptions made by the internal C code. It may be removed in the near future. Peter
Reasonably Related Threads
- [External] R hang/bug with circular references and promises
- [External] R hang/bug with circular references and promises
- R hang/bug with circular references and promises
- [External] R hang/bug with circular references and promises
- Objectsize function visiting every element for alt-rep strings