কীভাবে আর-তে কীপ্রেসের জন্য অপেক্ষা করবেন?


139

ব্যবহারকারীর কোনও কী চাপ না দেওয়া পর্যন্ত আমি আমার আর স্ক্রিপ্টটি থামাতে চাই p

আমি এটা কিভাবে করবো?


আপনি কোন উত্তর পেয়েছেন যা আপনি গ্রহণ করতে পারেন?
লিও লোপল্ড হার্টজ

উত্তর:


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 এটি কাজ করে না যদি আমি স্ট্রিডিয়োতে ​​স্ক্রিপ্ট চালনা করি যেমন প্রিন্ট ("হাই") রিডলাইন ("চালিয়ে যেতে একটি কী টিপুন") মুদ্রণ ("হো") এটি সম্ভবত কারণ সেশনটি ইন্টারেক্টিভ নয়। অ-ইন্টারেক্টিভ সেশনে এটি কীভাবে করবেন?
পাসকালআইভ

79

পদ্ধতি 1

আপনি কনসোলে [প্রবেশ করুন] চাপ না দেওয়া পর্যন্ত অপেক্ষা করুন:

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

একটি কার্য মধ্যে মোড়ানো:

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

এই ফাংশনটি Console.ReadKey()সি # এর সেরা সমতুল্য ।

পদ্ধতি 2

আপনি কীবোর্ডে [enter] কীস্ট্রোক টাইপ না করা পর্যন্ত বিরতি দিন। এই পদ্ধতির অসুবিধা হ'ল আপনি যদি এমন কিছু টাইপ করেন যা একটি নম্বর নয় তবে এটি একটি ত্রুটি প্রদর্শন করবে।

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

একটি কার্য মধ্যে মোড়ানো:

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

পদ্ধতি 3

কল্পনা করুন যে কোনও গ্রাফে অন্য বিন্দুর চক্রান্ত করার আগে আপনি কীপ্রেসের জন্য অপেক্ষা করতে চান। এই ক্ষেত্রে, আমরা কোনও গ্রাফের মধ্যে কী-পিসের জন্য অপেক্ষা করতে 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]")
}

এখানে আপনি গ্রাফটি দেখতে পাবেন, এর পয়েন্টের অর্ধেক রঙিন, কীবোর্ডে পরবর্তী কীস্ট্রোকের জন্য অপেক্ষা করতে হবে।

সামঞ্জস্যতা: পরিবেশের অধীনে পরীক্ষিত উইন.গ্রাফ বা এক্স 11 ব্যবহার করে । বিপ্লব আর ভি 6.1 এর সাথে উইন্ডোজ 7 x64 এর সাথে কাজ করে। আর স্টুডিও-র অধীনে কাজ করে না (কারণ এটি উইন.গ্রাফ ব্যবহার করে না)।

এখানে চিত্র বর্ণনা লিখুন


6
promptযুক্তিটি ব্যবহার করে 1 পদ্ধতিটি ছোট করা যেতে পারে readlinewhat=""কলটিতে যোগ করা থাকলে পদ্ধতি 2 কোনও ইনপুট (কেবল সংখ্যা নয়) নিয়ে কাজ করবে scangetGraphicsEventকেবলমাত্র নির্দিষ্ট প্ল্যাটফর্মের নির্দিষ্ট গ্রাফিক্স ডিভাইসগুলিতে কাজ করে (তবে আপনি যদি এই ডিভাইসগুলির মধ্যে একটি ব্যবহার করেন তবে এটি দুর্দান্ত কাজ করে)।
গ্রেগ স্নো

2
আপনি যদি এই ফাংশনটি (পদ্ধতি 1) if(line == "Q") stop()
লুপটিতে

18

এখানে একটি সামান্য ফাংশন (tcltk প্যাকেজ ব্যবহার করে) একটি ছোট উইন্ডো খুলবে এবং আপনি চালিয়ে যান বোতামটি ক্লিক না করা বা কোনও কী (যতক্ষণ না ছোট উইন্ডোটিতে এখনও ফোকাস রয়েছে) টিপুন ততক্ষণ অপেক্ষা করা হবে, তবে এটি আপনার স্ক্রিপ্টটি চালিয়ে যেতে দেবে।

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 সমর্থন করে (যা আমি মনে করি সমস্ত সাধারণ), কোনও কী প্রেসে প্রতিক্রিয়া জানাবে (কেবল সন্নিবিষ্ট নয়), এবং এমনকি স্ক্রিপ্টটি ব্যাচ মোডে চালিত হওয়ার পরেও কাজ করে (তবে এটি এখনও ব্যাচ মোডে বিরতি দেয়) , সুতরাং আপনি যদি এটি চালিয়ে না যান তবে এটি চিরকাল অপেক্ষা করবে)। ক্লিক না করা থাকলে বা কোনও চাবিকাঠি চাপানো না থাকলে এটি নির্ধারিত সময়ের পরে চালিয়ে যাওয়ার জন্য একটি টাইমার যুক্ত করা যেতে পারে।

কোন কী টিপানো হয়েছিল তা ফিরে আসে না (তবে এটি করার জন্য পরিবর্তন করা যেতে পারে)।


এটা অসাধারণ. তবে কেবল একটি সতর্কতা, এটি আরস্টুডিও-সার্ভার ওয়েবক্লিয়েন্টে চলবে না, কোনও কারণে ( Error in structure(.External(.C_dotTclObjv, objv), class = "tclObj") : [tcl] invalid command name "toplevel". )
মিলিয়া

2
@ মিলিয়া, এটি সঠিক। Tcltk ভিত্তিক কোডটির স্থানীয় মেশিনে চালানো দরকার এবং আরস্টুডিও-সার্ভারে চলবে না।
গ্রেগ স্নো

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.