2014/08/30
R > DOS 窓でインタラクティブな実行(3)
R > DOS 窓でインタラクティブな実行(3)
一昨日、昨日の続き。昨日の R スクリプトファイル+バッチファイルの組み合わせで、もう少し工夫してみる。実行環境は 2014/08/13 の実機を参照。例えば ↓ のように二ファイルを作って同じ場所に置く。
■ R スクリプトファイル 20140830_1.R
■ バッチファイル 20140830_1.R.bat
バッチファイルをダブルクリックすると ↓ スクリプトの前半に書いた処理が実行され、再実行するか終了するかの入力待ちになる。
↓ R と ENTER を入力すると、Rscript.exe に渡されたファイルが再び source 関数で呼び出される。確認のため「Redo ファイル名」を表示する。実行後は再び入力待ちに戻る。
↓ R / r 以外のキーで終了。
パッケージをロードする場合 ↓ 二回目以降はロード済みなので自動的にスキップされる。毎回 Rscript.exe にスクリプトを渡す場合より効率的。大きなデータを作る場合も、変数があればスルーするようにして二回目以降の実行を速くできる。
スクリプトファイルの再実行部分は DOS 窓でのみ機能し R コンソールでは何も起きない。だからスクリプトファイルをそのままコンソールでも実行できる。↓
バッチファイルは、自分のファイル名から .bat を除く部分 %~n0 がスクリプト名だと仮定して Rscript.exe に渡す。スクリプトファイル名が変わったり、別のスクリプトを実行する際、バッチの中身を変えずにファイル名だけ変えて同じ場所に置けばいい。↓
再実行の入力待機中にスクリプトファイルを編集した場合、全体の文字数が減らなければそのまま実行できるが、何故か文字数が減るとエラーになる。↓
普通に考えて、実行中のスクリプトを書き換えるのは無理がある。しかしスクリプトを微調整しながら何度も実行したい場合があるので、もう一工夫したスクリプトとバッチのひな形。↓
■ R スクリプトファイル 20140830_2.R
■ バッチファイル 20140830_2.R.bat
バッチ内でスクリプトを一時ファイルにコピーし Rscript.exe へ渡す。同時に元スクリプトも引数で渡す。スクリプトでは、再実行時に元スクリプトの方を実行する。これで、入力待機中に元スクリプトを編集し、簡単に再実行できる。
いわば DOS 窓が、要求に応じて同じスクリプトを実行しては待機する簡易 R サーバみたいなもの。HTML やサーバサイドスクリプトを編集してはブラウザをリロードするのにも似ている。R コンソールはアドホックな用途、スクリプト実行・編集は DOS 窓と使い分けできるかも。
■ R スクリプトファイル 20140830_1.R
message('何らかの処理...1')
message('何らかの処理...2')
message('')
# 以下 DOS 窓でのみ、繰り返し実行オプション起動
if(!interactive()){
while(1){
con = file('stdin')
message('R / r : Redo\nOthers : End')
inp = scan(file=con, nlines=1, quiet=T, what=character())
close(con)
if(length(grep('^[Rr]$', inp)) == 1){
fln = sub('--file=', '', commandArgs()[4])
message('Redo ', fln)
source(fln)
}
options(show.error.messages=F)
stop('')
}
}
■ バッチファイル 20140830_1.R.bat
@ECHO OFF
"C:/Program Files/R/R-2.15.3/bin/i386/Rscript.exe" %~n0
ECHO 任意のキー打鍵で DOS 窓を閉じます
PAUSE > NUL
バッチファイルをダブルクリックすると ↓ スクリプトの前半に書いた処理が実行され、再実行するか終了するかの入力待ちになる。
↓ R と ENTER を入力すると、Rscript.exe に渡されたファイルが再び source 関数で呼び出される。確認のため「Redo ファイル名」を表示する。実行後は再び入力待ちに戻る。
↓ R / r 以外のキーで終了。
パッケージをロードする場合 ↓ 二回目以降はロード済みなので自動的にスキップされる。毎回 Rscript.exe にスクリプトを渡す場合より効率的。大きなデータを作る場合も、変数があればスルーするようにして二回目以降の実行を速くできる。
library(rgeos)
message('何らかの処理...1')
message('何らかの処理...2')
message('')
以下略
スクリプトファイルの再実行部分は DOS 窓でのみ機能し R コンソールでは何も起きない。だからスクリプトファイルをそのままコンソールでも実行できる。↓
バッチファイルは、自分のファイル名から .bat を除く部分 %~n0 がスクリプト名だと仮定して Rscript.exe に渡す。スクリプトファイル名が変わったり、別のスクリプトを実行する際、バッチの中身を変えずにファイル名だけ変えて同じ場所に置けばいい。↓
再実行の入力待機中にスクリプトファイルを編集した場合、全体の文字数が減らなければそのまま実行できるが、何故か文字数が減るとエラーになる。↓
library(rgeos)
message('何らかの処理...1')
message('何らかの処理...2')
message('二回目実行の前に、この行を追加し。三回目の前に消した')
message('')
以下略
普通に考えて、実行中のスクリプトを書き換えるのは無理がある。しかしスクリプトを微調整しながら何度も実行したい場合があるので、もう一工夫したスクリプトとバッチのひな形。↓
■ R スクリプトファイル 20140830_2.R
message('何らかの処理...1')
message('何らかの処理...2')
message('')
# 以下 DOS 窓でのみ、繰り返し実行オプション起動
if(!interactive()){
while(1){
con = file('stdin')
message('R / r : Redo\nOthers : End')
inp = scan(file=con, nlines=1, quiet=T, what=character())
close(con)
if(length(grep('^[Rr]$', inp)) == 1){
fln = commandArgs()[6] # ここだけ変更
message('Redo ', fln)
source(fln)
}
options(show.error.messages=F)
stop('')
}
}
■ バッチファイル 20140830_2.R.bat
@ECHO OFF
SET FLN=%~dp0%~n0
SET TMP=tmp.R
COPY %FLN% %TMP% > NUL
"C:/Program Files/R/R-2.15.3/bin/i386/Rscript.exe" %TMP% %FLN%
DEL %TMP% > NUL
ECHO 任意のキー打鍵で DOS 窓を閉じます
PAUSE > NUL
バッチ内でスクリプトを一時ファイルにコピーし Rscript.exe へ渡す。同時に元スクリプトも引数で渡す。スクリプトでは、再実行時に元スクリプトの方を実行する。これで、入力待機中に元スクリプトを編集し、簡単に再実行できる。
library(rgeos)
message('何らかの処理...1')
message('何らかの処理...2')
# message('二回目の実行で、何か長い長い長い長い長い処理を追加した')
# message('三回目の実行で、消した')
message('')
以下略
いわば DOS 窓が、要求に応じて同じスクリプトを実行しては待機する簡易 R サーバみたいなもの。HTML やサーバサイドスクリプトを編集してはブラウザをリロードするのにも似ている。R コンソールはアドホックな用途、スクリプト実行・編集は DOS 窓と使い分けできるかも。