[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