Odpowiedzi:
Jak ktoś już napisał w komentarzu, nie musisz wcześniej używać kota readline()
. Po prostu napisz:
readline(prompt="Press [enter] to continue")
Jeśli nie chcesz, aby przypisać ją do zmiennej i nie chcą powrotu drukowany w konsoli, zawinąć readline()
w sposób invisible()
:
invisible(readline(prompt="Press [enter] to continue"))
press esc keep to exit loop
?
Metoda 1
Czeka, aż naciśniesz [enter] w konsoli:
cat ("Press [enter] to continue")
line <- readline()
Zawijanie do funkcji:
readkey <- function()
{
cat ("Press [enter] to continue")
line <- readline()
}
Ta funkcja jest najlepszym odpowiednikiem Console.ReadKey()
w C #.
Metoda 2
Zrób pauzę, aż naciśniesz klawisz [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)
Zawijanie do funkcji:
readkey <- function()
{
cat("[press [enter] to continue]")
number <- scan(n=1)
}
Metoda 3
Wyobraź sobie, że chcesz poczekać na naciśnięcie klawisza przed wykreśleniem kolejnego punktu na wykresie. W tym przypadku możemy użyć getGraphicsEvent (), aby poczekać na naciśnięcie klawisza w grafie.
Ten przykładowy program ilustruje 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]")
}
Tutaj możesz zobaczyć wykres, z kolorową połową punktów, czekający na kolejne naciśnięcie klawisza na klawiaturze.
Zgodność: Testowane w środowiskach używaj win.graph lub X11 . Działa z Windows 7 x64 z Revolution R v6.1. Nie działa pod RStudio (ponieważ nie używa win.graph).
prompt
argumentu do readline
. Metoda 2 działałaby z dowolnymi what=""
danymi wejściowymi (nie tylko liczbami), gdyby zostały 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).
if(line == "Q") stop()
Oto mała funkcja (wykorzystująca pakiet tcltk), która otworzy małe okno i zaczeka, aż klikniesz przycisk Kontynuuj lub naciśniesz dowolny klawisz (podczas gdy małe okno nadal ma fokus), a następnie umożliwi kontynuowanie skryptu.
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)
}
Po prostu umieść mywait()
skrypt w dowolnym miejscu, w którym chcesz go zatrzymać.
Działa to na każdej platformie obsługującej tcltk (które, jak sądzę, są wszystkie popularne), będzie reagować na każde naciśnięcie klawisza (nie tylko enter), a nawet działa, gdy skrypt jest uruchamiany w trybie wsadowym (ale nadal zatrzymuje się w trybie wsadowym , więc jeśli nie ma Cię tam, aby kontynuować, będzie czekać wiecznie). Można dodać licznik czasu, aby kontynuować działanie po określonym czasie, jeśli nie zostanie kliknięty lub naciśnięty został klawisz.
Nie zwraca informacji, który klawisz został naciśnięty (ale można go w tym celu zmodyfikować).
Error in structure(.External(.C_dotTclObjv, objv), class = "tclObj") : [tcl] invalid command name "toplevel".
)
R i Rscript wysyłają ''
do readline i skanują w trybie nieinteraktywnym (zobacz ? readline
). Rozwiązaniem jest wymuszenie stdin
użycia skanowania.
cat('Solution to everything? > ')
b <- scan("stdin", character(), n=1)
Przykład:
$ Rscript t.R
Solution to everything? > 42
Read 1 item
Ta odpowiedź jest podobna do odpowiedzi Simona , ale nie wymaga dodatkowego wejścia poza nową linią.
cat("Press Enter to continue...")
invisible(scan("stdin", character(), nlines = 1, quiet = TRUE))
Używając nlines=1
zamiast tego n=1
, użytkownik może po prostu nacisnąć klawisz Enter, aby kontynuować skrypt RScript.
Rscript
: zatrzymuje się i wymaga tylko trafienia, Enter
aby kontynuować.
Sposobem na zrobienie tego (trochę, musisz wcisnąć przycisk zamiast klawisza, ale wystarczająco blisko) jest użycie błyszczącego:
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")
Z mojego doświadczenia wynika, że ma to unikalną cechę: nawet jeśli uruchomiłeś skrypt, który miał kod napisany zgodnie z runApp
funkcją, nie uruchomi się, dopóki nie naciśniesz przycisku w aplikacji (przycisk, który zatrzymuje aplikacje od wewnątrz stopApp
).