2013-03-07 35 views
93

ユーザーがキーを押すまで、Rスクリプトを一時停止したい。Rでキーを押すのを待つ方法は?

どうすればよいですか?

+0

は、あなたが受け入れることができる任意の答えを見つけたことがありますか? –

答えて

65

すでに誰かがコメントに書いている通り、readline()より前に猫を使う必要はありません。単に書く:

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

あなたが変数に代入すると、コンソールに印刷されたリターンを望んでいない、invisible()readline()をラップしたくない場合は、次の

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

これは最高の答えです。 –

68

方法1

ウェイツコンソールで、[Enter]を押すまで:関数に

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

ラッピング:

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

この関数はConsole.ReadKey()の最高同等ですC#で。あなたは、キーボードの[Enter]キーストロークを入力するまで

方法2

ポーズ。この方法の欠点は、数値ではないものを入力するとエラーが表示されることです。

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

あなたは、キーボード上の次のキーストロークを待って、色付きのポイントの半分で、グラフを見ることができます。

互換性:win.graphまたはX11のいずれかの環境でテスト済みです。 Windows 7 x64とRevolution R v6.1で動作します。 RStudioの下では動作しません(win.graphを使用しないため)。ここで

enter image description here

+5

方法1は 'readline'に' prompt'引数を使用することで短縮できます。方法2は、 'what =" "'が 'scan'への呼び出しに追加された場合には、何らかの入力(数字だけでなく)で動作します。 'getGraphicsEvent'は、特定のプラットフォーム上の特定のグラフィックデバイスでのみ動作します(ただし、これらのデバイスのいずれかを使用している場合はうまく動作します)。 –

+2

'readline'と' scan'はLinuxのコマンドラインで動作しません –

+2

この関数(方法1)をループで使用していて、ループを止めたい場合は、次のようにしてください: 'if(line ==" Q ")stop()' –

17

小さなウィンドウを開いて、[続行]ボタンをクリックするか、(小さなウィンドウがまだフォーカスがある状態で)任意のキーを押すのいずれかになるまで待ちます(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をサポートしているプラ​​ットフォーム(これは一般的なものだと思います)でも動作し、キー入力(入力だけでなく)に応答し、スクリプトがバッチモードで実行されても機能しますバッチモードで一時停止するので、そこにいなければ永遠に待機します。クリックされていないかキーが押されている場合は、設定した時間が経過してもタイマーを続けることができます。

どのキーが押されたかは返されませんが、変更することができます。

+0

素晴らしいです。しかし、何らかの理由で(何らかの理由で)何らかの理由でRStudio-Server Webクライアント上で警告が出されません。(構造体エラー(.External(.C_dotTclObjv、objv)、class = "tclObj"): [tcl]無効なコマンド名 "toplevel ")') – milia

+1

@ミリア、それは正しいです。 tcltkに基づくコードはローカルマシン上で実行する必要があり、RStudio-Serverでは実行されません。 –

11

RとRscriptはともに''をreadlineに送り、非対話モードでスキャンします(? readline参照)。解決方法は、スキャンを使用してstdinを強制的に実行することです。

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

例:

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

驚くばかり!これは[私の問題](https://stackoverflow.com/questions/47294283/how-to-run-an-r-script-and-show-a-plot)をほぼ解決します。コンソールがテキスト+ Returnを待っていなくても、最初のキー押しに反応してもいいです(「何かキーを押し続ける」のように)。 – Vorac

関連する問題