Comment attendre une touche dans R?

Je veux mettre en pause mon script R jusqu’à ce que l’utilisateur appuie sur une touche.

Comment puis-je faire cela?

    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 voulez pas l’affecter à une variable et que vous ne voulez pas que le retour soit imprimé dans la console, enveloppez le readline() dans un invisible() :

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

    Méthode 1

    Attend que vous appuyiez sur [enter] dans 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

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

     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 vouliez attendre une touche avant de tracer un autre point sur un graphique. Dans ce cas, nous pouvons utiliser getGraphicsEvent () pour attendre une pression sur 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 en couleur, attendant la frappe suivante sur le clavier.

    Compatibilité: Testé sous des environnements, utilisez win.graph ou X11 . Fonctionne avec Windows 7 x64 avec Revolution R v6.1 Ne fonctionne pas sous RStudio (car il n'utilise pas win.graph).

    entrer la description de l'image ici

    Voici une petite fonction (utilisant le paquet tcltk) qui ouvrira une petite fenêtre et attendra que vous cliquiez sur le bouton Continuer ou que vous appuyiez sur une touche (alors que la petite fenêtre a toujours le focus), votre script continuera alors.

     library(tcltk) mywait < - function() { tt <- tktoplevel() tkpack( tkbutton(tt, text='Continue', command=function()tkdestroy(tt)), side='bottom') tkbind(tt,'', function()tkdestroy(tt) ) tkwait.window(tt) } 

    Il suffit de mettre mywait() dans votre script partout où vous souhaitez que le script mywait() pause.

    Cela fonctionne sur toute plate-forme qui prend en charge tcltk (qui, à mon avis, sont les plus courantes), répondra à toute pression sur une touche (pas seulement à saisir) et fonctionne même lorsque le script est exécuté en mode batch , donc si vous n’êtes pas là pour continuer, il faudra attendre pour toujours). Un temporisateur pourrait être ajouté pour le faire continuer après un certain temps s’il n’a pas été cliqué ou si une touche est enfoncée.

    Il ne retourne pas quelle touche a été pressée (mais pourrait être modifiée pour le faire).

    R et Rscript envoient '' à readline et scannent en mode non interactif (voir ? readline ). La solution consiste à forcer stdin utilisant scan.

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

    Exemple:

     $ Rscript tR Solution to everything? > 42 Read 1 item 

    Cette réponse est similaire à celle de Simon , mais ne nécessite pas de saisie 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.