R(画面出力と入力)

2019年3月 4日 (月)

[R]コンソール画面の表示を更新する

コンソール画面でsource関数でスクリプトを実行したとき、cat関数などで出力した結果はすぐには表示されない。例えば、以下の4行の内容をスクリプトファイルwait1.Rに保存する。

for (i in 1:5) {
    cat(sprintf("%d\n", i))
    mx <- solve(matrix(rnorm(1.e6), nrow = 1.e3))
}

実行してみる。

> source("wait1.R")
1
2
3
4
5

実行後、数秒~十数秒間何も表示されずに待たされた後に、1から5までがまとめて表示されるはず。Rのコンソール画面では、cat関数などによるコンソールへの出力はまとめて出力されてしまう。これを、逐次表示されるようにするには、flush.console関数を使う。

for (i in 1:5) {
    cat(sprintf("%d\n", i))
    mx <- solve(matrix(rnorm(1.e6), nrow = 1.e3))
    flush.console()
}

以下の5行の内容をスクリプトファイルwait2.Rに保存する。

for (i in 1:5) {
    cat(sprintf("%d\n", i))
    mx <- solve(matrix(rnorm(1.e6), nrow = 1.e3))
    flush.console()
}

実行してみる。

> source("wait2.R")
1
2
3
4
5

今度は、1から5までが順次表示されるはず。flush.console関数の場所で、コンソール画面の表示が更新されている。これは、例えば処理に時間のかかるスクリプトを作成し、その実行の経過をコンソール画面への出力で確認するときなど使えるテクニック。

VBA(Visual Basic for Applications)では、画面表示などを更新(画面表示のバッファを解放)するためにDoEvents関数を使用するテクニックがあるが、それと似たような動作と思えばよい(ただし、こちらはオペレーティングシステムに制御を一瞬渡すのであって、更新されるのは画面表示に限らないことに注意)。

なお、バッチ処理では、このようなコンソールへの出力はまとめて行われないことに注意。