Quiero pausar mi script R hasta que el usuario presione una tecla.
¿Cómo hago esto?
Quiero pausar mi script R hasta que el usuario presione una tecla.
¿Cómo hago esto?
Respuestas:
Como alguien ya escribió en un comentario, no tienes que usar el gato antes readline()
. Simplemente escribe:
readline(prompt="Press [enter] to continue")
Si no desea asignarlo a una variable y no desea que se imprima una declaración en la consola, envuélvala readline()
en un invisible()
:
invisible(readline(prompt="Press [enter] to continue"))
press esc keep to exit loop
?
Método 1
Espera hasta que presiones [enter] en la consola:
cat ("Press [enter] to continue")
line <- readline()
Envolviendo en 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 pulsación de tecla [enter] en el teclado. La desventaja de este método es que si escribe algo que no es un número, mostrará un error.
print ("Press [enter] to continue")
number <- scan(n=1)
Envolviendo en 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 muestra 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 próxima pulsación del teclado.
Compatibilidad: probado en entornos con win.graph o X11 . Funciona con Windows 7 x64 con Revolution R v6.1. No funciona bajo RStudio (ya que no usa win.graph).
prompt
argumento to readline
. El método 2 funcionaría con cualquier entrada (no solo números) si what=""
se agregaran a la llamada a scan
. getGraphicsEvent
solo funciona en dispositivos gráficos específicos en ciertas plataformas (pero si está utilizando uno de esos dispositivos, funciona bien).
if(line == "Q") stop()
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 la pequeña ventana todavía tiene el foco), luego permitirá que su script 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 coloque mywait()
su script en cualquier lugar donde desee que el script se detenga.
Esto funciona en cualquier plataforma que admita tcltk (que creo que son todas las comunes), responderá a cualquier pulsación de tecla (no solo enter), e incluso funciona cuando el script se ejecuta en modo por lotes (pero aún se detiene en modo por lotes , así que si no estás allí para continuar, esperará para siempre). Se podría agregar un temporizador para que continúe después de un período de tiempo establecido si no se hace clic o se presiona una tecla.
No devuelve qué tecla se presionó (pero podría modificarse para hacerlo).
Error in structure(.External(.C_dotTclObjv, objv), class = "tclObj") : [tcl] invalid command name "toplevel".
)
R y Rscript se envían ''
a readline y se escanean en modo no interactivo (ver ? readline
). La solución es forzar el stdin
uso del escaneo.
cat('Solution to everything? > ')
b <- scan("stdin", character(), n=1)
Ejemplo:
$ Rscript t.R
Solution to everything? > 42
Read 1 item
Esta respuesta es similar a la de Simon , pero no requiere una entrada adicional que no sea una nueva línea.
cat("Press Enter to continue...")
invisible(scan("stdin", character(), nlines = 1, quiet = TRUE))
Utilizando en nlines=1
lugar de n=1
, el usuario puede simplemente presionar enter para continuar el Rscript.
Rscript
: hace una pausa y solo requiere golpear Enter
para continuar.
Una forma de hacerlo (un poco, debes presionar un botón en lugar de una tecla, pero lo suficientemente cerca) es usar el brillo:
library(shiny)
ui <- fluidPage(actionButton("button", "Press the button"))
server <- function(input, output) {observeEvent(input$button, {stopApp()})}
runApp(shinyApp(ui = ui, server = server))
print("He waited for you to press the button in order to print this")
Según mi experiencia, esto tiene una característica única: incluso si ejecutó un script que tenía un código escrito después de la runApp
función, no se ejecutará hasta que haya presionado el botón en la aplicación (botón que detiene el uso interno de las aplicaciones stopApp
).