mtext - text in r
¿Cómo esperar una pulsación de tecla en R? (4)
Quiero detener mi secuencia de comandos R hasta que el usuario presione una tecla.
¿Cómo hago esto?
Aquí hay una pequeña función (usando el paquete tcltk) que abrirá una pequeña ventana y esperará hasta que haga clic en el botón Continuar o presione cualquier tecla (mientras que la ventana pequeña aún tiene el foco), luego permitirá que su secuencia de comandos continúe.
library(tcltk)
mywait <- function() {
tt <- tktoplevel()
tkpack( tkbutton(tt, text=''Continue'', command=function()tkdestroy(tt)),
side=''bottom'')
tkbind(tt,''<Key>'', function()tkdestroy(tt) )
tkwait.window(tt)
}
Simplemente ponga mywait()
en su secuencia de comandos en cualquier lugar donde desee que se pause el script.
Esto funciona en cualquier plataforma que admita tcltk (que creo que es la más común), responderá a cualquier pulsación de tecla (no solo ingrese), e incluso funcionará cuando el script se ejecute en modo batch (pero aún hace una pausa en modo batch) , así que si no estás allí para continuar, esperará por siempre). Se podría agregar un temporizador para que continúe después de un período de tiempo determinado si no se hace clic o se presiona una tecla.
No devuelve la tecla presionada (pero podría modificarse para hacerlo).
R y Rscript envían ''''
para leer y escanear en modo no interactivo (ver ? readline
). La solución es forzar stdin
usando scan.
cat(''Solution to everything? > '')
b <- scan("stdin", character(), n=1)
Ejemplo:
$ Rscript t.R
Solution to everything? > 42
Read 1 item
Método 1
Espera hasta que presione [enter] en la consola:
cat ("Press [enter] to continue")
line <- readline()
Envolviendo una función:
readkey <- function()
{
cat ("Press [enter] to continue")
line <- readline()
}
Esta función es el mejor equivalente de Console.ReadKey()
en C #.
Método 2
Haga una pausa hasta que escriba la tecla [enter] en el teclado. La desventaja de este método es que si escribe algo que no es un número, se mostrará un error.
print ("Press [enter] to continue")
number <- scan(n=1)
Envolviendo una función:
readkey <- function()
{
cat("[press [enter] to continue]")
number <- scan(n=1)
}
Método 3
Imagine que desea esperar una pulsación de tecla antes de trazar otro punto en un gráfico. En este caso, podemos usar getGraphicsEvent () para esperar una pulsación de tecla dentro de un gráfico.
Este programa de ejemplo ilustra el concepto:
readkeygraph <- function(prompt)
{
getGraphicsEvent(prompt = prompt,
onMouseDown = NULL, onMouseMove = NULL,
onMouseUp = NULL, onKeybd = onKeybd,
consolePrompt = "[click on graph then follow top prompt to continue]")
Sys.sleep(0.01)
return(keyPressed)
}
onKeybd <- function(key)
{
keyPressed <<- key
}
xaxis=c(1:10) # Set up the x-axis.
yaxis=runif(10,min=0,max=1) # Set up the y-axis.
plot(xaxis,yaxis)
for (i in xaxis)
{
# On each keypress, color the points on the graph in red, one by one.
points(i,yaxis[i],col="red", pch=19)
keyPressed = readkeygraph("[press any key to continue]")
}
Aquí puede ver el gráfico, con la mitad de sus puntos coloreados, esperando la siguiente pulsación del teclado.
Compatibilidad: probado en entornos use win.graph o X11 . Funciona con Windows 7 x64 con Revolution R v6.1. No funciona bajo RStudio (ya que no usa win.graph).
Como alguien ya escribió en un comentario, no es necesario usar el gato antes de readline()
. Simplemente escribe:
readline(prompt="Press [enter] to continue")
Si no desea asignarlo a una variable y no desea que se imprima en la consola, ajuste readline()
en un elemento invisible()
:
invisible(readline(prompt="Press [enter] to continue"))