2013-03-07 17 views

Odpowiedz

65

Jak ktoś już napisał w komentarzu, nie musisz używać kota przed readline(). Wystarczy napisać:

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

Jeśli nie chcesz, aby przypisać ją do zmiennej i nie chcą powrotu drukowany w konsoli, owinąć readline() w invisible():

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

Myślę, że to najlepsza odpowiedź tutaj. –

68

Metoda 1

Waits do momentu naciśnięcia przycisku [ENTER] w konsoli:

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

zawijania do funkcji:

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

Ta funkcja jest najlepszym odpowiednikiem Console.ReadKey() w języku C#.

Metoda 2

Pauza aż wpisać naciśnięcie klawisza [Enter] na klawiaturze. Wadą tej metody jest to, że jeśli wpiszesz coś, co nie jest liczbą, wyświetli się błąd.

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

owijania do funkcji:

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

Metoda 3

Wyobraź sobie, że chcesz czekać na naciśnięcie klawisza przed wykreślenie kolejny punkt na wykresie. W takim przypadku możemy użyć getGraphicsEvent(), aby poczekać na naciśnięcie klawisza na wykresie.

Ten przykładowy program przedstawia koncepcję:

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

Tu można zobaczyć na wykresie, przy czym połowa z jego punktów barwnych, czekając na kolejne naciśnięcie klawisza na klawiaturze.

Zgodność: Przetestowane w środowiskach używają albo win.graph, albo X11. Działa z Windows 7 x64 z Revolution R v6.1. Nie działa pod RStudio (ponieważ nie używa win.graph).

enter image description here

+5

Metoda 1 może zostać skrócona za pomocą argumentu 'prompt' dla' readline'. Metoda 2 działałaby z dowolnymi danymi wejściowymi (nie tylko liczbami), jeśli 'what =" "' zostało dodane do wywołania 'scan'. 'getGraphicsEvent' działa tylko na określonych urządzeniach graficznych na niektórych platformach (ale jeśli używasz jednego z tych urządzeń, działa dobrze). –

+2

'readline' i' scan' nie działają w linii poleceń pod Linuksem –

+2

Jeśli używasz tej funkcji (Metoda 1) w pętli i chcesz przerwać pętlę, dołącz na przykład: 'if (linia ==" Q ") stop()' –

17

Oto trochę funkcji (przy użyciu pakietu tcltk), który otworzy się małe okienko i czekać, aż albo kliknąć przycisk Kontynuuj lub nacisnąć dowolny przycisk (podczas gdy małe okno wciąż ma fokus) , to pozwoli twojemu skryptowi kontynuować.

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

Wystarczy umieścić w skrypcie mywait() w dowolnym miejscu, w którym chcesz wstrzymać skrypt.

Działa to na każdej platformie obsługującej tcltk (co moim zdaniem jest najczęstsze), odpowiada na każde naciśnięcie klawisza (nie tylko wpis), a nawet działa, gdy skrypt jest uruchamiany w trybie wsadowym (ale nadal działa zatrzymuje się w trybie wsadowym, więc jeśli nie będziesz go kontynuować, będzie to czekać na zawsze). Można dodać licznik czasu, aby był kontynuowany po określonym czasie, jeśli nie został kliknięty lub został naciśnięty klawisz.

Nie zwraca tego, który klawisz został naciśnięty (ale można to zmienić).

+0

To jest niesamowite. Ale po prostu ostrzeżenie, z jakiegoś powodu nie uruchomi się z klientem serwera RStudio ("Błąd w strukturze (.External (.C_dotTclObjv, objv), class =" tclObj "): [tcl] niepoprawna nazwa polecenia" toplevel " ".') – milia

+1

@milia, to prawda. Kod oparty na tcltk musi być uruchamiany na komputerze lokalnym i nie może być uruchamiany na serwerze RStudio. –

11

R i Rscript zarówno wysyła '', aby odczytywać i skanować w trybie nieinteraktywnym (patrz ? readline). Rozwiązaniem jest wymuszenie skanowania przy użyciu stdin.

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

Przykład:

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

Awesome! To prawie rozwiązuje [mój problem] (https://stackoverflow.com/questions/47294283/how-to-run-an-r-script-and-show-a-plot). Nadal byłoby miło, gdyby konsola nie czekała na tekst + Return, ale zareagowała raczej na pierwsze naciśnięcie klawisza (jak w "Naciśnij dowolny klawisz, aby kontynuować"). – Vorac

Powiązane problemy