2014/08/29
R > DOS 窓でインタラクティブな実行(2)
R > DOS 窓でインタラクティブな実行(2)
昨日の続き。実行環境は 2014/08/13 の実機を参照。一つのスクリプトで、R コンソールと DOS 窓(コマンドプロンプト)両方で同じインタラクティブな操作をしたい。昨日は単純な ENTER 入力待ちをメモした。今日はもう少し実用的に、入力キーによる分岐の簡単な例。またバッチファイルを作ってダブルクリック一つで DOS 窓で実行させる。
上のコードを適当なファイルに保存し、まず R コンソールでテスト。↓ 最初にプロンプトが出て入力待機。プロンプト文字列の中に改行 \n を使えるので、複数行のメニュー風にもできる。
コードは、正の整数が入力されたらその個数の一様乱数を発生し、サイコロを振ったと見当てて結果(各目が出た回数)を集計して表示し、再びプロンプトで待機。E か e が入力されたら終了。他の文字が入力されたら ↓ 再度プロンプトを出して待機。
同じスクリプトを DOS 窓から Rscript.exe で実行した様子。↓
注意点として、DOS 窓で使う scan 関数のオプション what に character() を指定し、文字型に変換して入力値を受け取ること。デフォルトでは double() になっており数値以外の入力でエラーになる。一方 R コンソールで使う readline 関数は入力の型によらず文字で結果を返す。
昨日も含め、ここまで DOS 窓での実行は Rscript コマンドを手動で入力してきた。しかし本命はバッチファイルを作ってダブルクリック一つで起動すること。例えば ↓ のように。
↓ バッチファイルをダブルクリックして実行した様子。スクリプト内での入出力以外は画面に出ず、すっきり。E で終了した後、任意のキー打鍵で自動的に DOS 窓が閉じる。
今回のスクリプトは、全体を while で囲み E が入力されない限りループを抜けないようにした。これと、再帰的なスクリプト呼び出し(source 関数を使用)を組み合わせると、スクリプトを修正しながらの再実行&結果確認が簡単になる。その例を(3)で書く。
msg = 'Integer : sample size\nE : end\n'
while(1){
if(interactive()){
# R コンソール
inp = readline(msg)
} else {
# DOS 窓
con = file('stdin')
cat(msg)
inp = scan(file=con, nlines=1, quiet=T, what=character())
}
# ここで入力待ち
if(length(grep('^[0-9]+$', inp))==1){
# サイコロを振るシミュレーション
dce = ceiling(runif(as.integer(inp)) * 6)
mat = as.matrix(table(cbind(dce)))
colnames(mat) = 'count'
print(mat)
message('')
} else if(length(grep('^[Ee]$', inp))==1){
message('End')
break
}
}
上のコードを適当なファイルに保存し、まず R コンソールでテスト。↓ 最初にプロンプトが出て入力待機。プロンプト文字列の中に改行 \n を使えるので、複数行のメニュー風にもできる。
コードは、正の整数が入力されたらその個数の一様乱数を発生し、サイコロを振ったと見当てて結果(各目が出た回数)を集計して表示し、再びプロンプトで待機。E か e が入力されたら終了。他の文字が入力されたら ↓ 再度プロンプトを出して待機。
同じスクリプトを DOS 窓から Rscript.exe で実行した様子。↓
注意点として、DOS 窓で使う scan 関数のオプション what に character() を指定し、文字型に変換して入力値を受け取ること。デフォルトでは double() になっており数値以外の入力でエラーになる。一方 R コンソールで使う readline 関数は入力の型によらず文字で結果を返す。
昨日も含め、ここまで DOS 窓での実行は Rscript コマンドを手動で入力してきた。しかし本命はバッチファイルを作ってダブルクリック一つで起動すること。例えば ↓ のように。
@ECHO OFF
"C:/Program Files/R/R-2.15.3/bin/i386/Rscript.exe" "R:/TMP/20140829_1.R"
ECHO press any key to close
PAUSE > NUL
↓ バッチファイルをダブルクリックして実行した様子。スクリプト内での入出力以外は画面に出ず、すっきり。E で終了した後、任意のキー打鍵で自動的に DOS 窓が閉じる。
今回のスクリプトは、全体を while で囲み E が入力されない限りループを抜けないようにした。これと、再帰的なスクリプト呼び出し(source 関数を使用)を組み合わせると、スクリプトを修正しながらの再実行&結果確認が簡単になる。その例を(3)で書く。