2011-08-13 9 views
12

En versiones anteriores de R, versión 2.9 de todos modos, pude ejecutar un programa R desde un lote utilizando rterm.exe y crear una ventana gráfica que un usuario podía desplazarse hacia adelante y hacia atrás y ver los gráficos. Yo era capaz de hacer eso mediante el uso de un código R como:getGraphicsEvent para leer el teclado para una sesión no interactiva

kbd <- function(key) { 
if (key == "q") { "Quit" } else NULL } 
getGraphicsEvent(" ", onKeybd = kbd) 

Esto llevó a cabo los gráficos visor abierto hasta que el usuario pulsa la tecla "q". En las versiones más nuevas de R, parece que dado que esto se inicia desde un lote (no interactivo utilizando Rterm.exe), el valor clave siempre es NULL y la ventana de gráficos simplemente parpadea y se cierra. Mi pregunta es si hay alguna manera de convencer de alguna manera al sistema R de que estoy ejecutando una sesión casi interactiva y obtener el comportamiento de getGraphicsEvent para no devolver NULL de inmediato?

+0

¿Puede proporcionar más código para demostrar completamente el problema? El ejemplo de '? GetGraphicsEvent' funciona para mí en' Rterm.exe'. –

+0

Puede que no sea capaz de ayudar, pero tengo curiosidad de por qué estás tomando ese enfoque. He estado usando R desde hace algunos años y la mayoría de las veces desarrollé usando Rstudio y no me gustó demasiado la gráfica, pero recientemente estoy investigando la biblioteca brillante y sus aplicaciones interactivas extremadamente fáciles de construir. Tal vez si tiene la flexibilidad puede mirar brillante. –

Respuesta

0

Aquí está el código fuente para getGraphicsEvent:

 
function (prompt = "Waiting for input", onMouseDown = NULL, onMouseMove = NULL, 
    onMouseUp = NULL, onKeybd = NULL, consolePrompt = prompt) 
{ 

    if (!interactive()) 
     return(NULL) 
    if (!missing(prompt) || !missing(onMouseDown) || !missing(onMouseMove) || 
     !missing(onMouseUp) || !missing(onKeybd)) { 
     setGraphicsEventHandlers(prompt = prompt, onMouseDown = onMouseDown, 
      onMouseMove = onMouseMove, onMouseUp = onMouseUp, 
      onKeybd = onKeybd) 
    } 
    .External2(C_getGraphicsEvent, consolePrompt) 
} 

Se puede ver por qué se devuelve NULL, ya que se hace explícita con if (!interactive()) return(NULL). Pruebe esta inserta en el código original:

 

getGraphicsEvent2 = function (prompt = "Waiting for input", onMouseDown = NULL, onMouseMove = NULL, 
    onMouseUp = NULL, onKeybd = NULL, consolePrompt = prompt) 
{ 

    # if (!interactive()) 
    #  return(NULL) 
    if (!missing(prompt) || !missing(onMouseDown) || !missing(onMouseMove) || 
     !missing(onMouseUp) || !missing(onKeybd)) { 
     setGraphicsEventHandlers(prompt = prompt, onMouseDown = onMouseDown, 
      onMouseMove = onMouseMove, onMouseUp = onMouseUp, 
      onKeybd = onKeybd) 
    } 
    .External2(C_getGraphicsEvent, consolePrompt) 
} 
environment(getGraphicsEvent2) = environment(grDevices::getGraphicsEvent) 

dragplot(rnorm(1000), rnorm(1000)) 


kbd = function(key) { 
if (key == "q") { "Quit" } else NULL } 
getGraphicsEvent2("Waiting for input", onKeybd = kbd) 

Parece que perder funcionalidad (es decir, que no podía manipular la trama en OSX con X11 como dispositivo gráfico), pero, al menos, la trama se queda hasta. La llamada al código interno para esta función ha cambiado recientemente (para confirmar, busque el código fuente para R en dos versiones; el código para esta función en R 2.6.2, por ejemplo, está en R-2.6.2/src/library/grDevices /R/gevents.R).

1

Usted puede fingir una sesión interactiva en la que se detecta como no interactivo iniciando Rterm con la opción

--ess 

en Windows, o

--interactive 

en Unix -alikes.

Esto puede causar otros problemas, ya que todas las funciones verán la sesión como interactiva. No puede cambiar esa bandera en el medio de una sesión, ya que afecta muchas cosas relacionadas con E/S.

Cuestiones relacionadas