Mientras trabajo en una consola R, me gustaría configurar una tarea en segundo plano que supervisa una conexión en particular y cuando se produce un evento, se ejecuta otra función (una alerta). Alternativamente, puedo configurar cosas para que una función externa simplemente envíe una alerta a R, pero este parece ser el mismo problema: es necesario configurar un oyente.¿Puede la consola R soportar tareas en segundo plano o interrupciones (gestión de eventos)?
Puedo hacer esto en un proceso dedicado de R, pero no sé si esto es factible desde una consola. Además, no estoy interesado en interrumpir R si está calculando una función, pero alertando o interrumpiendo si la consola simplemente está esperando la entrada.
Aquí hay tres casos de uso:
El ejemplo más simple posible está viendo un archivo. Supongamos que tengo un archivo llamado "latestData.csv" y quiero monitorear los cambios; cuando cambia, se ejecuta
myAlert()
. (Se puede ampliar para hacer cosas diferentes, pero solo aparece una nota que dice que un archivo ha cambiado.)Un tipo diferente de monitor observaría si una máquina determinada tiene poca memoria RAM y podría ejecute un
save.image()
y termine. Nuevamente, esto podría ser un simple problema de ver un archivo producido por un monitor externo que guarda la salida detop
o algún otro comando.Un ejemplo diferente es como otra pregunta reciente sobre SO: have R halt the EC2 machine it's running on. Si una alerta de otra máquina o proceso le dice al programa que guarde & finalice, entonces poder escuchar esa alerta sería genial.
Por el momento, sospecho que hay dos maneras de manejar esta vía: Rserve y, posiblemente, a través de fork
. Si alguien tiene ejemplos de cómo hacer esto con un paquete o mediante otro método, sería genial. Creo que resolver cualquiera de estos tres casos de uso los resolvería a todos, modulo un poco de código externo.
Nota 1: Me di cuenta, per this answer to another SO question que R es un solo subproceso, por lo que sospecho fork
y Rserve puede funcionar. Sin embargo, no estoy seguro acerca de la viabilidad si uno está interactuando con una terminal R. Aunque R's REPL se adjunta a la entrada de la consola, estoy tratando de evitar esto o imitarlo, que es donde fork
o Rserve
pueden ser la respuesta.
Nota 2: Para aquellos que estén familiarizados con los métodos de manejo de eventos/eventos, eso resolvería todo, también. Yo no he encontrado nada sobre esto en R.
Actualización 1: Me he dado cuenta que el manual para escribir extensiones R has a section referencing event handling, que menciona el uso de R_PolledEvents
. Esto parece prometedor.
¿Puedes aclarar tu segundo párrafo? Estoy feliz de que algo revise un estado periódicamente. +1 para las sugerencias sobre tcl/tk y gtk. Definitivamente miraré 'triggr' y veré si puedo adaptarlo o las ideas. – Iterator
Miré 'triggr', pero supongo que tendré que mirar los métodos tcl/tk o gtk, como sugieres. – Iterator