आर में एक कुंजीपट की प्रतीक्षा कैसे करें?


139

मैं अपनी आर स्क्रिप्ट को तब तक रोकना चाहता हूं जब तक उपयोगकर्ता एक कुंजी दबाता है।

मैं यह कैसे करु?


क्या आपको कोई जवाब मिला है जिसे आप स्वीकार कर सकते हैं?
लेओ लेपोल्ड हर्ट्ज़ '

जवाबों:


127

जैसा कि किसी ने पहले ही एक टिप्पणी में लिखा है, आपको पहले बिल्ली का उपयोग करने की आवश्यकता नहीं है readline()। बस लिखें:

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

आप एक चर निर्दिष्ट करने के लिए नहीं करना चाहते हैं और एक वापसी कंसोल में मुद्रित नहीं करना चाहते हैं, लपेट readline()एक में invisible():

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

मुझे लगता है कि यह यहां सबसे अच्छा जवाब है।
लेओ लेपोल्ड हर्ट्ज़ '

1
कैसे इसके बारे में एक और सुविधा जोड़ने के बारे में? press esc keep to exit loop?
I_m_LeMarque

4
@nnn यह काम नहीं करता है अगर मैं rstudio में एक स्क्रिप्ट चलाता हूं जैसे कि प्रिंट ("हाय") रीडलाइन ("जारी रखने के लिए एक कुंजी दबाएं") प्रिंट ("हो") इसकी शायद इसलिए कि सत्र इंटरैक्टिव नहीं है। गैर-संवादात्मक सत्र में ऐसा कैसे करें?
पास्कलीव

79

विधि 1

प्रतीक्षा करें जब तक आप कंसोल में [एंटर] दबाएं:

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

एक समारोह में लपेटकर:

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

यह फ़ंक्शन Console.ReadKey()C # में सबसे अच्छा समकक्ष है ।

विधि 2

जब तक आप कीबोर्ड पर [एंटर] कीस्ट्रोक नहीं टाइप करते हैं, तब तक रुकें। इस पद्धति का नुकसान यह है कि यदि आप कोई ऐसी चीज़ टाइप करते हैं जो कोई संख्या नहीं है, तो यह एक त्रुटि प्रदर्शित करेगा।

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

एक समारोह में लपेटकर:

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

विधि 3

कल्पना कीजिए कि आप एक ग्राफ़ पर किसी अन्य बिंदु को प्लॉट करने से पहले एक कुंजीपट की प्रतीक्षा करना चाहते हैं। इस स्थिति में, हम एक ग्राफ के भीतर एक keypress की प्रतीक्षा करने के लिए getGraphicsEvent () का उपयोग कर सकते हैं।

यह नमूना कार्यक्रम अवधारणा को दर्शाता है:

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

यहां आप ग्राफ़ को देख सकते हैं, जिसके आधे बिंदु रंगीन हैं, कीबोर्ड पर अगले कीस्ट्रोक का इंतजार कर रहे हैं।

संगतता: वातावरण के तहत परीक्षण किया गया या तो win.graph या X11 का उपयोग करें । क्रांति आर v6.1 के साथ विंडोज 7 x64 के साथ काम करता है। RStudio के तहत काम नहीं करता है (क्योंकि यह win.graph का उपयोग नहीं करता है)।

यहां छवि विवरण दर्ज करें


6
विधि 1 को promptतर्क का उपयोग करके छोटा किया जा सकता है readline। यदि आप what=""कॉल करने के लिए जोड़े गए हैं, तो विधि 2 किसी भी इनपुट (न केवल संख्या) के साथ काम करेगी scangetGraphicsEventकेवल कुछ प्लेटफार्मों पर विशिष्ट ग्राफिक्स उपकरणों पर काम करता है (लेकिन यदि आप उन उपकरणों में से एक का उपयोग कर रहे हैं जो ठीक काम करते हैं)।
ग्रेग स्नो

2
यदि आप इस फ़ंक्शन (विधि 1) को लूप में उपयोग कर रहे हैं और लूप को रोकना चाहते हैं, तो उदाहरण के लिए शामिल करें:if(line == "Q") stop()
Dorian Grv

18

यहाँ एक छोटा सा फ़ंक्शन (टैल्कट पैकेज का उपयोग करके) है जो एक छोटी सी खिड़की खोलेगा और तब तक प्रतीक्षा करेगा जब तक कि आप जारी बटन पर क्लिक करें या किसी भी कुंजी को दबाएं (जबकि छोटी खिड़की पर अभी भी फोकस है), तो यह आपकी स्क्रिप्ट को जारी रखने देगा।

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()अपनी स्क्रिप्ट को कहीं भी कि आप स्क्रिप्ट को रोकना चाहते हैं।

यह किसी भी प्लेटफ़ॉर्म पर काम करता है जो tcltk (जो मुझे लगता है कि सभी आम हैं) का समर्थन करता है, किसी भी कुंजी प्रेस (सिर्फ प्रवेश नहीं) का जवाब देगा, और यहां तक ​​कि काम करता है जब स्क्रिप्ट बैच मोड में चलाया जाता है (लेकिन यह अभी भी बैच मोड में रुकता है) , इसलिए यदि आप इसे जारी रखने के लिए नहीं हैं तो यह हमेशा के लिए इंतजार करेगा)। अगर इसे क्लिक नहीं किया गया है या एक कुंजी दबाया गया है, तो इसे निर्धारित समय के बाद जारी रखने के लिए टाइमर जोड़ा जा सकता है।

यह वापस नहीं आता है कि किस कुंजी को दबाया गया (लेकिन ऐसा करने के लिए संशोधित किया जा सकता है)।


यह विस्मयकारी है। लेकिन सिर्फ एक चेतावनी, यह किसी कारण के लिए RStudio-Server वेबक्लेयर पर नहीं चलेगा, (Error in structure(.External(.C_dotTclObjv, objv), class = "tclObj") : [tcl] invalid command name "toplevel".
जूनिया

2
@ मिलिया, यह सही है। Tcltk पर आधारित कोड को स्थानीय मशीन पर चलाने की आवश्यकता होती है और यह RStudio-Server पर नहीं चलेगा।
ग्रेग स्नो

14

''गैर-संवादात्मक मोड में रीडलाइन और स्कैन करने के लिए आर और रूपए दोनों भेजते हैं (देखें ? readline)। समाधान stdinस्कैन का उपयोग करने के लिए मजबूर करना है।

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

उदाहरण:

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

2
बहुत बढ़िया! यह लगभग मेरी समस्या को हल करता है । फिर भी यह अच्छा होगा यदि कंसोल टेक्स्ट + रिटर्न की प्रतीक्षा नहीं कर रहा है, बल्कि पहले की-बोर्ड पर प्रतिक्रिया व्यक्त करता है (जैसा कि "जारी रखने के लिए कोई भी कुंजी दबाएं")।
वोरैक

3

यह उत्तर साइमन के समान है , लेकिन एक नई पंक्ति के अलावा अतिरिक्त इनपुट की आवश्यकता नहीं है।

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

nlines=1इसके बजाय का उपयोग करते हुए n=1, उपयोगकर्ता केवल रुपये को जारी रखने के लिए एंटर दबा सकता है।


+1 यह एकमात्र उत्तर है जो वास्तव में मेरे लिए वांछित काम करता है। अंदर Rscript: यह रुकता है और Enterजारी रखने के लिए केवल हिट करने की आवश्यकता होती है ।
अरीफ

2
इसने आर को तोड़ दिया और मुझे सत्र को समाप्त करना पड़ा
बूँदबामट

1
इंटरैक्टिव मोड में, यह आर को तोड़ता है और सत्र को समाप्त करने की आवश्यकता होती है। कृपया अपने प्रवेश पर चेतावनी जोड़ें, जिस स्थिति में, मैं डाउनवोट को हटा दूंगा।
हनीबुद्ध

विंडोज पर उम्मीद के मुताबिक मेरे लिए काम किया!। स्वीकृत समाधान (ऊपर) को छोड़ दिया गया था और विराम नहीं दिया था। यह वास्तव में रुका हुआ था और मेरे हिट में आने का इंतजार कर रहा था।
मैट डी

0

इसे करने का एक तरीका (थोड़े, आपको कुंजी के बजाय एक बटन दबाना होगा, लेकिन काफी करीब है) चमकदार का उपयोग करना है:

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

मेरे अनुभव के अनुसार, इसकी एक विशिष्ट विशेषता है: भले ही आप एक स्क्रिप्ट runAppचलाते हों, जिसमें फ़ंक्शन के बाद लिखा कोड था , यह तब तक नहीं चलेगा जब तक आप ऐप में बटन दबाए नहीं जाते हैं (बटन जो एप्लिकेशन को उपयोग करने से रोकता है stopApp)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.