Dear R-helpers, I've just started playing with getGraphicsEvent() in R, and was wondering if there is a simple way to stop this function waiting for input after a pre-defined time, instead of relying either on a non-NULL value from one of the event handlers or for a user-interrupt for it to halt (as per the R manual). The only way that I've thought of to make this work is using setTimeLimit to kill the function after a set time - here's a (messy) example: setTimeLimit(cpu = 1) plot(0, 0) eventEnv <- getGraphicsEventEnv() setGraphicsEventHandlers(prompt = 'Test') while(TRUE) { err <- try(q <- getGraphicsEvent(), silent=TRUE) print(err) } # Not run setTimeLimit(cpu = Inf) but setTimeLimit doesn't seem to kill getGraphicsEvent() properly, as running this code just ends up with the repeated returned error of "Error in getGraphicsEvent(): recursive use of getGraphicsEvent not supported" instead of the intended "Error: reached CPU time limit" every second. Is there a way to get around this problem, or a different method to make this work? Or should I quit dabbling in things beyond my ken? Thanks, Nick
...because you're catching the timeout error with try() so it has not effect, and hence the while(TRUE) {} loop keeps running. Without knowing anything about graphics event handlers per se, here's an alternative to catch the timeout event: library("R.utils"); plot(0, 0); eventEnv <- getGraphicsEventEnv(); setGraphicsEventHandlers(prompt='Test'); q <- NULL; evalWithTimeout({ q <- getGraphicsEvent(); }, timeout=1); print(q); does it. See print(evalWithTimeout) to see what you are doing differently. My $.02 /Henrik On Thu, Dec 15, 2011 at 9:49 PM, beetonn <Nicholas.Beeton at utas.edu.au> wrote:> Dear R-helpers, > > I've just started playing with getGraphicsEvent() in R, and was wondering if there is a simple way to stop this function waiting for input after a pre-defined time, instead of relying either on a non-NULL value from one of the event handlers or for a user-interrupt for it to halt (as per the R manual). > > The only way that I've thought of to make this work is using setTimeLimit to kill the function after a set time - here's a (messy) example: > > setTimeLimit(cpu = 1) > plot(0, 0) > eventEnv <- getGraphicsEventEnv() > setGraphicsEventHandlers(prompt = 'Test') > while(TRUE) > { > ? err <- try(q <- getGraphicsEvent(), silent=TRUE) > ? print(err) > } > # Not run > setTimeLimit(cpu = Inf) > > but setTimeLimit doesn't seem to kill getGraphicsEvent() properly, as running this code just ends up with the repeated returned error of "Error in getGraphicsEvent(): recursive use of getGraphicsEvent not supported" instead of the intended "Error: reached CPU time limit" every second. > > Is there a way to get around this problem, or a different method to make this work? ?Or should I quit dabbling in things beyond my ken? > > > Thanks, > Nick > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.
Thanks, Henrik! That's given me some food for thought, and evalWithTimeout certainly seems to be a nicer way of doing this than setTimeLimit. I should probably explain a little more clearly: I want to stop getGraphicsEvent() without stopping the program flow (assume we're running the code from a source file) - hence the error catching in my example. If we allow the exception through, it stops the program (which I don't want) but stops getGraphicsEvent() properly, meaning we can run it again (which I do want). If we don't, the exception is caught and getGraphicsEvent() keeps running - meaning we can't run it again without it throwing a recursion error. To illustrate, if we set up with: library(R.utils) plot(0) eventEnv <- getGraphicsEventEnv() setGraphicsEventHandlers(prompt = 'Test') and then while (TRUE) evalWithTimeout( {out <- getGraphicsEvent();}, timeout=1, onTimeout="error") it crashes out of the loop with a time-out error. If we instead use while (TRUE) evalWithTimeout( {out <- getGraphicsEvent();}, timeout=1, onTimeout="ignore") it throws a recursion error after running getGraphicsEvent() for the second time. By the way, I may have found a bug in evalWithTimeout - there is a line else if (onTimeout == "silent") { but "silent" is not one of the allowed arguments to the function. I changed this to "ignore" and it seemed to work fine. Cheers, Nick> ...because you're catching the timeout error with try() so it > has not > effect, and hence the while(TRUE) {} loop keeps running. > > Without knowing anything about graphics event handlers per se, here's > an alternative to catch the timeout event: > > library("R.utils"); > > plot(0, 0); > eventEnv <- getGraphicsEventEnv(); > setGraphicsEventHandlers(prompt='Test'); > > q <- NULL; > evalWithTimeout({ > q <- getGraphicsEvent(); > }, timeout=1); > print(q); > > does it. See print(evalWithTimeout) to see what you are > doing differently. > > My $.02 > > /Henrik > > On Thu, Dec 15, 2011 at 9:49 PM, beetonn > wrote: > > Dear R-helpers, > > > > I've just started playing with getGraphicsEvent() in R, and > was wondering if there is a simple way to stop this function > waiting for input after a pre-defined time, instead of relying > either on a non-NULL value from one of the event handlers or for > a user-interrupt for it to halt (as per the R manual). > > > > The only way that I've thought of to make this work is using > setTimeLimit to kill the function after a set time - here's a > (messy) example: > > > > setTimeLimit(cpu = 1) > > plot(0, 0) > > eventEnv <- getGraphicsEventEnv() > > setGraphicsEventHandlers(prompt = 'Test') > > while(TRUE) > > { > > err <- try(q <- getGraphicsEvent(), silent=TRUE) > > print(err) > > } > > # Not run > > setTimeLimit(cpu = Inf) > > > > but setTimeLimit doesn't seem to kill getGraphicsEvent() > properly, as running this code just ends up with the repeated > returned error of "Error in getGraphicsEvent(): recursive use of > getGraphicsEvent not supported" instead of the intended "Error: > reached CPU time limit" every second. > > > > Is there a way to get around this problem, or a different > method to make this work? Or should I quit dabbling in things > beyond my ken? > > > > > > Thanks, > > Nick
Possibly Parallel Threads
- getGraphicsEvent on X11 and event queuing
- Handlers in setGraphicsEventHandlers() can recursively call getGraphicsEvent(). Intended behavior?
- Handlers in setGraphicsEventHandlers() can recursively call getGraphicsEvent(). Intended behavior?
- getGraphicsEvent on X11 and event queuing
- getGraphicsEvent() and setTimeLimit() bug and compatibility patch.