StatsBeginner: 初学者の統計学習ノート

統計学およびR、Pythonでのプログラミングの勉強の過程をメモっていくノート。たまにMacの話題。

Rのループ中に進捗率を表示するプログレスバーを作る

Rのループで使えるプログレスバーは、いくつかのパッケージで提供されているみたいなのですが、自分で書くのも簡単なので、単純な関数でつくってみた。
進捗が知りたいのは時間のかかる処理をするときであり、時間がかかるなら無駄な計算は省きたいので、ループ1回ごとには出さずに100回とか1000回ごとに表示したほうがいいかもしれない。

### 自作プログレスバーをつくる

# バーは40文字からなり、-が#に置き換わっていくようにした。
# 右端に%表示を出しておく。
# 処理は単に、ループ全体の何番目をやってるのかをwhichとlengthで
# 取得して、それを文字列でのバーに置き換えてmessageとして吐くだけ。
# '\r'は行頭復帰を意味し、appendLF=FALSEは改行しないことを意味する。
# これらの組み合わせで、「表示をまるごと更新する」の意味になる。
# '\r'は、message()内の引数としては、prg.barの前でも後ろでもいいし、
# paster時にくっつけといてもよい。
# (messageは、複数の文字列を任意個数並べられる。)

show.progress <- function(i, x){
  # iとxにはforのループ変数とリストを与える
  prg <- round(which(x==i)/length(x)*100)
  done   <- paste(rep('#', round(prg/2.5)),    collapse='')
  remain <- paste(rep('-', 40-round(prg/2.5)), collapse='')
  prg.bar <- paste('|', done, remain, '|  ', as.character(prg), '%', sep='')
  message('\r', prg.bar, appendLF=FALSE)
}

### 試用してみる

# 素因数分解できるパッケージ
library(gmp)
factorize(as.bigz("5656"))

# 1億〜1億3万までの素因数分解を進捗バーつきでやってみる
x<- 100000000:100030000
primes <- list()
for (xi in x){
  show.progress(xi,x)
  xi <- as.character(xi)
  p <- factorize(as.bigz(xi))
  p <- as.numeric(p)
  primes <- c(primes, list(p))
}


使うと、こんな感じで昔のパソコンみたいな動きになる。


f:id:midnightseminar:20200920130355g:plain


ちなみに、環境によっては、messageの行のあとにflush.console()を挟まないと、100%まで行ってからいきなり表示されるような場合もあるかもしれない。自分の場合は不要だったが。