web-dev-qa-db-ja.com

Rでキーを押すのを待つ方法は?

ユーザーがキーを押すまでRスクリプトを一時停止します。

どうすればいいですか?

120
Contango

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

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

変数に割り当てたくない場合、およびコンソールに戻り値を出力したくない場合は、readline()invisible()でラップします。

invisible(readline(Prompt="Press [enter] to continue"))
97
nnn

方法1

コンソールで[Enter]を押すまで待機します。

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

関数へのラッピング:

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

この関数は、C#の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]")
}

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

互換性:環境下でテストするには、win.graphまたは X11 を使用します。 Revolution R v6.1を搭載したWindows 7 x64で動作します。 RStudioでは機能しません(win.graphを使用しないため)。

enter image description here

74
Contango

(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をサポートするすべてのプラットフォームで機能し(これはすべて一般的なものだと思います)、任意のキープレスに応答するだけでなく(入力するだけでなく)、スクリプトがバッチモードで実行されている場合でも機能します、したがって、あなたがそれを継続するためにそこにいなければ、それは永遠に待つでしょう)。タイマーを追加して、クリックされない場合、またはキーが押された場合に、一定の時間が経過しても継続するようにすることができます。

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

17
Greg Snow

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
11

この回答は Simon の回答と似ていますが、改行以外の追加入力は必要ありません。

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

nlines=1の代わりにn=1を使用すると、ユーザーはEnterキーを押すだけでRscriptを続行できます。

0
Dennis YL