web-dev-qa-db-fra.com

Comment attendre une pression de touche dans R?

Je souhaite suspendre mon script R jusqu'à ce que l'utilisateur appuie sur une touche. 

Comment puis-je faire cela?

111
Contango

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

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

Si vous ne souhaitez pas l'affecter à une variable et ne souhaitez pas qu'une déclaration soit imprimée dans la console, placez readline() dans une invisible():

invisible(readline(Prompt="Press [enter] to continue"))
88
nnn

Méthode 1

Attend que vous appuyiez sur la touche [Entrée] de la console:

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

Envelopper 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

Faites une pause jusqu'à ce que vous tapiez la touche [Entrée] du clavier. L'inconvénient de cette méthode est que si vous tapez quelque chose qui n'est pas un nombre, une erreur s'affichera.

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

Envelopper dans une fonction:

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

Méthode 3

Imaginez que vous souhaitiez attendre une pression sur une touche avant de tracer un autre point sur un graphique. Dans ce cas, nous pouvons utiliser getGraphicsEvent () pour attendre une pression de touche dans 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 colorés, en attente de la prochaine frappe sur le clavier. 

Compatibilité: Les environnements testés utilisent soit win.graph, soit X11 . Fonctionne avec Windows 7 x64 avec Revolution R v6.1. Ne fonctionne pas sous RStudio (car il n’utilise pas win.graph).

enter image description here

74
Contango

Voici une petite fonction (utilisant le paquet tcltk) qui ouvrira une petite fenêtre et attendra de cliquer sur le bouton Continuer ou d’appuyer sur une touche quelconque (tant que la petite fenêtre aura toujours le focus), puis laissera votre script se poursuivre.

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

Il suffit de mettre mywait() dans votre script à un endroit où vous souhaitez le suspendre.

Cela fonctionne sur n’importe quelle plate-forme prenant en charge tcltk (qui, à mon avis, est l’une des plus communes), répondra à n’importe quelle touche (pas seulement entrée) et fonctionne même lorsque le script est exécuté en mode de traitement par lots (mais il reste suspendu en mode par lots donc si vous n’êtes pas là pour le continuer, il faudra attendre pour toujours). Une minuterie peut être ajoutée pour la poursuivre après un certain délai si vous ne cliquez pas ou si vous appuyez sur une touche.

Elle ne renvoie pas la touche sur laquelle vous avez appuyé (mais peut être modifiée pour le faire).

17
Greg Snow

R et Rscript envoient tous deux '' à readline et numérisent en mode non interactif (voir ? readline). La solution consiste à forcer stdin à l’aide de scan.

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

Exemple:

$ Rscript t.R 
Solution to everything? > 42
Read 1 item
11
Simon A. Eugster

Cette réponse est similaire à celle de Simon , mais ne nécessite aucune entrée supplémentaire autre qu'une nouvelle ligne.

cat("Press Enter to continue...")
invisible(scan("stdin", character(), nlines = 1, quiet = TRUE))

En utilisant nlines=1 au lieu de n=1, l'utilisateur peut simplement appuyer sur Entrée pour continuer le script.

1
Dennis YL