160

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

どうすればよいですか?

4

7 に答える 7

160

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

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

それを変数に割り当てたくない場合、およびコンソールにリターンを出力したくない場合は、次のようにラップreadline()しますinvisible()

invisible(readline(prompt="Press [enter] to continue"))
于 2013-09-11T16:27:51.597 に答える
81

方法1

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

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

関数へのラップ:

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

この関数は、Console.ReadKey()C#と同等の機能です。

方法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のいずれかを使用する環境でテストされています。RevolutionRv6.1を搭載したWindows7x64で動作します。RStudioでは機能しません(win.graphを使用しないため)。

ここに画像の説明を入力してください

于 2013-03-07T13:50:42.890 に答える
14

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
于 2014-04-08T09:33:11.553 に答える