168 votes

Comment attendre la frappe d'une touche de R?

Je veux faire une pause mon script R jusqu'à ce que l'utilisateur appuie sur une touche.

Comment dois-je faire?

168voto

nnn Points 500

Comme quelqu'un l'a déjà écrit dans un commentaire, vous n'avez pas à utiliser le chat avant d' readline(). Simplement écrire:

readline(prompt="Press [enter] to continue")

Si vous ne voulez pas assigner à une variable et ne veulent pas d'un retour imprimé dans la console, envelopper l' readline() en invisible():

invisible(readline(prompt="Press [enter] to continue"))

84voto

Contango Points 7976

Méthode 1

Attend jusqu'à ce que vous appuyez sur [entrée] dans la console:

cat ("Press [enter] to continue")
line <- readline()

Emballage dans une fonction:

readkey <- function()
{
    cat ("Press [enter] to continue")
    line <- readline()
}

Cette fonction est le meilleur équivalent de Console.ReadKey() en C#.

Méthode 2

Pause jusqu'à ce que vous tapez le bouton [enter] en appuyant sur les touches du clavier. L'inconvénient de cette méthode est que si vous tapez quelque chose qui n'est pas un nombre, il affiche une erreur.

print ("Press [enter] to continue")
number <- scan(n=1)

Emballage dans une fonction:

readkey <- function()
{
    cat("[press [enter] to continue]")
    number <- scan(n=1)
}

Méthode 3

Imaginez que vous voulez attendre la frappe d'une touche avant de traçage un autre point sur un graphique. Dans ce cas, on peut utiliser getGraphicsEvent() pour attendre la frappe d'une touche à l'intérieur d'un graphique.

Cet exemple de programme illustre le concept:

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]")
}

Ici vous pouvez voir le graphique, avec la moitié de ses points de couleur, en attendant la prochaine séquence de touches sur le clavier.

Compatibilité: Testé dans les environnements de gagner.graphique ou X11. Fonctionne avec Windows 7 x64 avec la Révolution R v6.1. Ne fonctionne pas sous RStudio (qu'il n'utilise pas de gagner.le graphique).

enter image description here

19voto

Greg Snow Points 22040

Voici une petite fonction (en utilisant le package tcltk), qui ouvre une petite fenêtre et attendre jusqu'à ce que vous cliquez sur le bouton continuer ou appuyez sur n'importe quelle touche (alors que la petite fenêtre qui a le focus), puis il va laisser votre script de continuer.

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)
}

Vient de mettre mywait() dans votre script n'importe où que vous voulez que le script pour faire une pause.

Cela fonctionne sur toute plate-forme qui prend en charge tcltk (qui je pense est l'ensemble des communes proches), devra répondre à toutes les clés de la presse (pas juste à l'entrée), et fonctionne même lorsque le script est exécuté en mode batch (mais il reste encore des pauses en mode par lot, donc si vous n'êtes pas là pour la continuer, il attendra toujours). Un minuteur peut être ajouté pour permettre de continuer après un laps de temps si pas cliqué ou a l'appui d'une touche.

Il n'en revient pas quelle touche a été pressée (mais peut être modifié à le faire).

14voto

Simon A. Eugster Points 1815

R et Rscript la fois d'envoyer des '' de readline et de numérisation en mode non-interactif (voir ? readline). La solution est de forcer stdin l'utilisation du balayage.

cat('Solution to everything? > ')
b <- scan("stdin", character(), n=1)

Exemple:

$ Rscript t.R 
Solution to everything? > 42
Read 1 item

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X