日々のつれづれ

不惑をむかえ戸惑いを隠せない男性の独り言

自宅待機の子供にRで英単語テストを作った-その1

子供が入学したのに学校にいけない

我が家もようやく子供が進学。4月から高校生と中学生になりました。やった!

でも、御多分に漏れず、我が家も緊急事態宣言で在宅になってます。子供たちは在宅で課題をやったり、やらなかったり。 この時期に学生だった子供たちは習うはずの時期に習えなかったことが、将来の苦手意識になったりしない?って思うよ。 私も高校2年のときに入院してそ習えなかった単元がある。退院して頑張ったけど、今でも苦手なんだよな。

家庭学習の足しになにかしたい

この予想外の休み。長い春休みで良い面もあると思う。 いくら家庭学習の教材を渡していても、限界がある。新学期がいきなり始まったら、学校は追い付くために詰め込みしそう。 そう思って、何か役に立てないかな?って考えてた。自分のできることで。

そう考えていて、Rで単語帳を作ろうと思った。

要はreadlinesを使うだけ。

readlines関数はユーザーが入力した文字をcharacterで受け取って、処理に加える関数。 昔、Rやプログラムを知らない人がデータ入力や解析を簡易に実現する目的で使っていて、対話的な処理に使える。

手順は主に5つ。

  1. 英単語とその日本語を対にしたcsvファイルを準備する。
  2. csvファイルを読み込んで、そこからランダムに英単語と日本語のペアを抽出する
  3. 日本語をコンソールに表示する
  4. 日本語の対訳を入力させる、これをreadlines関数で受け取る
  5. 入力文字列と答えの英語が一致したら「正解」、間違ったら「間違い」と表示する

このとき、csvが複数あればreadlinesで選択、readlinesで解く問題数も指定できる、そうすると少し拡張できる。

こうして作ったコードがこちら

cat("\n英単語覚えた?\n\n")
cat("\nどちらにチャレンジしますか?\n\n")
# 作業ディレクトリ直下にdataフォルダを作って、その中にcsvファイルの単語データを入れている
word_file = sub(".csv","",dir(path="data")) 

# csvファイルの拡張子を除くファイル名をコンソールに表示する
# 入力した番号のcsvファイルを取得する
word_data = readline(cat(paste("[",seq(word_file),"]",word_file),"\n\n"))
word_data = word_file[as.numeric(word_data)]
word_data = dir(path="data",pattern=word_data,full.names=TRUE)
word_data = read.csv(word_data,stringsAsFactors=FALSE,check.names=FALSE)

cont_info = "y"
while(cont_info=="y"){
# 解く問題数をコンソールから入力する
# 問題数分の文字をcsvファイルからランダムに取得する
  score_info = readline(cat("\n\nチャレンジナンバーを入れてください! 10 ~",nrow(word_data),"\n\n"))
  score_info = as.numeric(score_info)
  word_id = sample(nrow(word_data),score_info)

# 解答を入れるベクトル、成否を入れるベクトル、解答時間を入れるベクトルを作る
  input_data = c()
  score_data = c()
  time_data = c()

# 問題数分をループ
  for(i in word_id){

# 開始時間の取得
    in_time = proc.time()

# 解答を入力させて、input_wordに入れる
    input_word = readline(paste("\n",word_data$JP[i],"\nv v v v v\n"))

# 答えと一致をみて、成否をscore_dataに入れる
    score_data = c(score_data,ifelse(input_word==word_data$EN[i],1,0))

# 終了時間を取得して、開始時間との差分をとる、秒でカウント
    time_data = c(time_data,(proc.time()-in_time)[3])

# 答え合わせを表示する、Sys.sleep()はなくてもいいけど、少し時間が空いた方が使いやすい
    cat("答え...",word_data$EN[i],"\n\n")
    Sys.sleep(1)
    cat(ifelse(input_word==word_data$EN[i],"正解!!       ( `ー´)ノ","間違い...    ( ..)φメモメモ"),"\n\n")
    input_data = c(input_data,input_word)
  }

# 問題数が終わったら、コンソールに正答数を表示する
  cat("\n\nあなたの点数は\n\n",paste(sum(score_data),"/",length(score_data),"点です\n"))
  Sys.sleep(1)
  cat("\n\nあなたの回答時間は\n\n",sum(time_data),"秒です\n")

# nを入力するまで、whileループで繰り返す
  cont_info = readline(paste("\n続けますか?(y/n) ....."))
}

全部の答えをdata.frame()に格納して、コンソールに結果を表示する
print_data = data.frame(問題=word_data$JP[word_id],正解=word_data$EN[word_id],あなたの回答=input_data,結果=factor(score_data,levels=1:0,labels=c("o","x")))

print(print_data)

このときの英単語のcsvファイルはこんな感じ。

JP EN
賛成する agree
反対する oppose
忠告する advise
助言 tip