単語帳に勉強量の記録機能を作った(自分用メモ。気にしないでね!!)

ネタっぽかったR単語帳ですが、僕の中ですごいいいので機能追加などしました。やった量が可視化なりできれば、やる気が出る(見える化)というわけですが、それを作ろうと。で、こんな関数を用意した。

# 初期化用
# old <- data.frame(date=Sys.time(),t(apply(tango[1:nrow(tango),][c("num_of_right","num_of_mistake","complete")],2,sum)))
record <- function(old,tango){
  cum <- data.frame(date=Sys.time(),t(apply(tango[1:nrow(tango),][c("num_of_right","num_of_mistake","complete")],2,sum)))
  eval(parse(text=paste(deparse(substitute(old))," <<- rbind(",deparse(substitute(old)),",cum)",sep="")))
}

で、こんな感じに実行します。日時と累積が出てきますので、差分などを取ると一日の学習量みたいな感じでできます。表でもいいし、グラフで可視化もRなら楽勝ですね。時系列とかでやればいいんじゃないかな!

> record(old,tango)
> old
                 date num_of_right num_of_mistake complete
1 2008-06-16 03:18:10          150            103       14
2 2008-06-16 03:53:35          157            103       15
3 2008-06-16 03:55:43          164            103       17

で、ちょっとコードが複雑になっているんですが。。。本来ならば、こういう風に書きたかった。

> old <- record(old,tango)

だけど、これだと代入先を間違えると学習記録がおじゃんになってしまいます。これはいかん!!

というわけでeval(parse(text=))のいつものコンビを使って、上のを動的に作り出しているわけです。でも、関数内のoldと引数に来るoldの名前がoldで一致するかは保証がないので(意味不明な日本語www)、deparse(substitute(old))とかやっているわけです。deparse(substitute(old))とかの使い方、意味等は昔のが参考になるかもしれない。

で、これでもまだだめで。ただの代入だと関数を出た後までスコープがないので(また日本語が(ry)、永続代入などをしています。

この辺のask_jaとかの関数は文字列を引数として取ることでdeparse(substitute(old))みたいなのがやってないわけですね。まあ、このrecordの例だとdeparse(substitute(old))を使わないとだめですが。

可視化するとこんな感じ!!
http://gyazo.com/cefff9a98164fe927c623f69a1d62db7.png

par(mfrow=c(2,1))
plot(old$date,old$complete,type="l",main="number of completes",lwd=5,cex=2,lty=1,col=4)
plot(old$date,old$num_of_right,type="l",main="number of right",lwd=5,cex=2,lty=1,col=2)