R'de bir tuşa basma nasıl beklenir?


Yanıtlar:


127

Birisinin zaten bir yorumda yazdığı gibi, kediyi daha önce kullanmanız gerekmez readline(). Basitçe şunu yazın:

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

Eğer bir değişkene atamayı istemiyorum ve konsolda basılmış bir dönüş istemiyorsanız, sarın readline()bir in invisible():

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

Bence buradaki en iyi cevap bu.
Léo Léopold Hertz 준영

1
bir özellik daha eklemeye ne dersiniz? press esc keep to exit loop?
I_m_LeMarque

4
@nnn rstudio'da bir komut dosyası çalıştırırsam bu çalışmaz, örneğin print ("hi") readline ("Devam etmek için bir tuşa basın") print ("ho") Muhtemelen oturum etkileşimli olmadığı için. Etkileşimli olmayan bir oturumda nasıl yapılır?
PascalIv

79

Yöntem 1

Konsolda [enter] tuşuna basana kadar bekler:

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

Bir işleve sarma:

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

Bu işlev Console.ReadKey()C # ile en iyi eşdeğeridir .

Yöntem 2

Klavyede [enter] tuş vuruşunu yazana kadar duraklatın. Bu yöntemin dezavantajı, sayı olmayan bir şey yazarsanız, bir hata göstermesidir.

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

Bir işleve sarma:

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

Yöntem 3

Bir grafik üzerinde başka bir nokta çizmeden önce bir tuşa basmayı beklemek istediğinizi düşünün. Bu durumda, grafik içinde bir tuşa basmayı beklemek için getGraphicsEvent () öğesini kullanabiliriz.

Bu örnek program kavramı göstermektedir:

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

Burada, klavyede bir sonraki tuş vuruşu için bekleyen, noktalarının yarısı renkli olan grafiği görebilirsiniz.

Uyumluluk: Ortamlar altında test edilmiş win.graph veya X11 kullanın . Revolution R v6.1 ile Windows 7 x64 ile çalışır. RStudio altında çalışmaz (win.graph kullanmaz).

resim açıklamasını buraya girin


6
Yöntem 1, promptargümanı kullanılarak kısaltılabilir readline. Yöntem 2 what="", çağrıya eklenirse herhangi bir girdiyle (yalnızca sayılarla) çalışır scan. getGraphicsEventyalnızca belirli platformlardaki belirli grafik cihazlarında çalışır (ancak bu cihazlardan birini kullanıyorsanız iyi çalışır).
Greg Snow

2
Bu işlevi (Yöntem 1) bir döngüde kullanıyorsanız ve döngüyü durdurmak istiyorsanız, örneğin aşağıdakileri ekleyin:if(line == "Q") stop()
Dorian Grv

18

Küçük bir pencere açacak ve devam düğmesine tıklayana veya herhangi bir tuşa (küçük pencerenin hala odağı varken) basana kadar bekleyecek küçük bir işlev (tcltk paketini kullanarak), komut dosyanızın devam etmesine izin verecektir.

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

mywait()Komut dosyanızı duraklatmak istediğiniz yere koymanız yeterlidir.

Bu, tcltk'yi destekleyen (tüm ortak olanlar olduğunu düşünüyorum) herhangi bir platformda çalışır, herhangi bir tuşa basmaya (yalnızca girmek değil) yanıt verir ve hatta komut dosyası toplu modda çalıştırıldığında bile çalışır (ancak toplu modda hala duraklar , devam etmek için orada değilseniz sonsuza kadar bekleyecektir). Tıklanmadığında veya bir tuşa basıldığında belirli bir süre sonra devam etmesi için bir zamanlayıcı eklenebilir.

Hangi tuşa basıldığını döndürmez (ancak bunu yapmak için değiştirilebilir).


Bu harika. Ancak sadece bir uyarı, bazı nedenlerden dolayı RStudio-Server web istemcisinde çalışmayacak ( Error in structure(.External(.C_dotTclObjv, objv), class = "tclObj") : [tcl] invalid command name "toplevel". )
milia

2
milia, bu doğru. Tcltk tabanlı kodun yerel makinede çalışması gerekir ve RStudio-Server'da çalışmaz.
Greg Snow

14

R ve Rscript hem ''readline'a gönderir hem de interaktif olmayan modda tarar (bkz. ? readline). Çözüm, stdintaramayı kullanarak zorlamaktır .

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

Misal:

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

2
Müthiş! Bu neredeyse sorunumu çözdü . Konsolun metin + Return için beklememesi, ancak ilk tuşa basması ("Devam etmek için herhangi bir tuşa basın" bölümünde olduğu gibi) yanıt vermeseydi yine de iyi olurdu.
Vorac

3

Bu cevap Simon'un cevabına benzer , ancak bir satırsonu dışında fazladan girdi gerektirmez.

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

Kullanılması nlines=1yerine n=1, kullanıcı basitçe basın Rscript devam etmek girebilirsiniz.


+1 aslında benim için istediğim gibi çalışan tek cevap bu. İçinde Rscript: duraklar ve Enterdevam etmek için sadece vurmak gerekir.
arielf

2
Bu R kırdı ve oturumu sonlandırmak zorunda kaldı
blobbymatt

1
etkileşimli modda, bu R'yi keser ve oturumun sonlandırılmasını gerektirir. Lütfen girişinize uyarı ekleyin, bu durumda aşağı oyu kaldıracağım.
HoneyBuddha

Windows'da beklendiği gibi benim için çalıştı !. Kabul edilen çözüm (yukarıda) atlandı ve duraklamadı. Bu gerçekten durakladı ve enter tuşuna basmamı bekledi.
Matt D

0

Bunu yapmanın bir yolu (tür, bir tuş yerine bir düğmeye basmanız gerekir, ancak yeterince yakın) parlak kullanmaktır:

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

Deneyimlerime göre, bunun benzersiz bir özelliği var: runAppişlevi takip eden kod yazmış bir komut dosyası çalıştırsanız bile , uygulamadaki düğmeye basana kadar (uygulamaların kullanılmasını durduran düğme) çalışmaz stopApp.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.