[R] Event handling in R

beetonn Nicholas.Beeton at utas.edu.au
Wed Dec 21 04:20:00 CET 2011


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



More information about the R-help mailing list