2014/08/28
R > DOS 窓でインタラクティブな実行(1)
R > DOS 窓でインタラクティブな実行(1)
DOS 窓って死語かもしれないが、R 自前のコンソールでなくコマンドプロンプトの意味。またインタラクティブな実行とは、ここではキーボードからの入力待ちや、入力内容での分岐。普通のスクリプト言語なら簡単だが、R は自前のコンソールとそれ以外で動作が違うので結構とまどう。忘れた時のためにメモ。実行環境は 2014/08/13 の実機を参照。
R 自前のコンソールなら、2014/06/29 に書いた readline 関数を ↓ のように使えば済む。
コードを適当なファイルに保存して R コンソールから呼び出すと ↓
入力待ちになった所で ENTER を押すと ↓
ところが、R を DOS 窓で実行する Rscript.exe または Rterm.exe でこのファイルを呼び出すと、入力待ちが無視されて次へ進んでしまう。実行時オプションをいろいろ変えても同じ。
理由は、readline 関数が interactive session でのみ動作する一方、Rscript.exe や Rterm.exe でスクリプトファイルを呼び出すと必ず non-interactive session になるから。readline と interactive session の詳細は下記ドキュメントを参照。
■ R Documentation : readline {base} : Read a Line from the Terminal
http://stat.ethz.ch/R-manual/R-devel/library/base/html/readline.html
■ R Documentation : interactive {base} : Is R Running Interactively?
http://stat.ethz.ch/R-manual/R-devel/library/base/html/interactive.html
何か方法はないか調べたら ↓ に挙がっている最後のコードが使えた。file('stdin') と scan 関数を使う。file と scan の詳細は二つ目・三つ目のリンクを参照。
■ Stack Overflow : I want to run a R code in batch and wait for user input
http://stackoverflow.com/questions/19817781/i-want-to-run-a-r-code-in-batch-and-wait-for-user-input
■ R Documentation : connections {base} : Functions to Manipulate Connections
http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html
■ R Documentation : scan {base} : Read Data Values
http://stat.ethz.ch/R-manual/R-devel/library/base/html/scan.html
↓ 先ほどのコードに DOS 窓の場合を分岐させた。R コンソール or DOS 窓の判別は interactive() で行える。実行結果も合わせて示す。
R コンソールで ENTER 入力後は省略。以上が、一つのスクリプトで R コンソールと DOS 窓ともにキーボードからの ENTER 入力待ちをするテンプレート。もう少し実用的に、入力キーで分岐したりする(2)へ続く。
R 自前のコンソールなら、2014/06/29 に書いた readline 関数を ↓ のように使えば済む。
message('何らかの処理...')
message('何らかの処理...')
rmd = runif(10)
print(rmd)
readline('ENTER to proceed')
# ここで入力待ちになる
print(rmd * 100)
message('何らかの処理...')
message('何らかの処理...')
コードを適当なファイルに保存して R コンソールから呼び出すと ↓
入力待ちになった所で ENTER を押すと ↓
ところが、R を DOS 窓で実行する Rscript.exe または Rterm.exe でこのファイルを呼び出すと、入力待ちが無視されて次へ進んでしまう。実行時オプションをいろいろ変えても同じ。
理由は、readline 関数が interactive session でのみ動作する一方、Rscript.exe や Rterm.exe でスクリプトファイルを呼び出すと必ず non-interactive session になるから。readline と interactive session の詳細は下記ドキュメントを参照。
■ R Documentation : readline {base} : Read a Line from the Terminal
http://stat.ethz.ch/R-manual/R-devel/library/base/html/readline.html
■ R Documentation : interactive {base} : Is R Running Interactively?
http://stat.ethz.ch/R-manual/R-devel/library/base/html/interactive.html
何か方法はないか調べたら ↓ に挙がっている最後のコードが使えた。file('stdin') と scan 関数を使う。file と scan の詳細は二つ目・三つ目のリンクを参照。
■ Stack Overflow : I want to run a R code in batch and wait for user input
http://stackoverflow.com/questions/19817781/i-want-to-run-a-r-code-in-batch-and-wait-for-user-input
■ R Documentation : connections {base} : Functions to Manipulate Connections
http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html
■ R Documentation : scan {base} : Read Data Values
http://stat.ethz.ch/R-manual/R-devel/library/base/html/scan.html
↓ 先ほどのコードに DOS 窓の場合を分岐させた。R コンソール or DOS 窓の判別は interactive() で行える。実行結果も合わせて示す。
message('何らかの処理...')
message('何らかの処理...')
rmd = runif(10)
print(rmd)
msg = 'ENTER to proceed'
if(interactive()){
# R コンソール
readline(msg)
} else {
# DOS 窓
con = file('stdin')
cat(msg)
invisible(scan(file=con, nlines=1, quiet=T))
}
# ここで入力待ちになる
print(rmd * 100)
message('何らかの処理...')
message('何らかの処理...')
R コンソールで ENTER 入力後は省略。以上が、一つのスクリプトで R コンソールと DOS 窓ともにキーボードからの ENTER 入力待ちをするテンプレート。もう少し実用的に、入力キーで分岐したりする(2)へ続く。