R/exams でオンラインテストの問題を作成する - その2
August 25, 2020
R
exams
目的
前回 に引き続き,R/exams を使った問題作成の方法を紹介します。
前回は R のコードを使わない基本的な択一問題を作りました。今回は簡単な R のコードを使って問題をコントロールする方法を紹介します。
exams
最近,exams は増加したユーザーからの要望に応える形で急速に機能を拡張しています。開発バージョンのインストールをおすすめします。
install.packages("exams", repos = "https://r-forge.r-project.org")
Case 2: R の変数を活用した数値問題を作る
前回 作った択一問題を数値問題に変形してみます。4つの山の標高を1つだけ抜いて、その高さを答えてもらいましょう。
ただし,空欄補充問題にする方が自然な感じもしますが、それは cloze タイプの問題を作るときにあらためて説明します。
Rmd ファイル
次のような Rmarkdown ファイルを作成します。名前は mountain-japan-num.Rmd
としておきましょう。
```{r, include=FALSE}
n <- sample(1:4, 1)
mnt <- data.frame(名称 = c("富士山", "北岳", "奥穂高岳", "間ノ岳"),
`標高 (m)` = c("3776", "3193", "3190", "3190"),
check.names = FALSE)
mnt_q <- mnt
mnt_q[n, "標高 (m)"] <- "[ ? ]"
```
Question
========
[ ? ] に入る整数値を答えなさい。
```{r, echo=FALSE}
knitr::kable(mnt_q, align = "lr", format = "markdown")
```
Solution
========
`r mnt[n, "名称"]` の標高は `r mnt[n, "標高 (m)"]` [m]。
Meta-information
================
extype: num
exsolution: `r mnt[n, "標高 (m)"]`
exname: Highest mountain in Japan
extol: 0
本文でやっていることは次のようなことです。
- 1〜4 の数字を1つランダムに選んで
n
という変数名をつける。 - 山の名称と標高をデータフレームに保存する。
- データフレームの
n
行目の「標高」データのみを消したデータフレームmnt_q
を作る。 - Question セクションで
mnt_q
を表示して,空欄に入る数字を解答するように指示する。 Solution
セクションでは,n
行目のデータに関する情報を書きます。`r mnt[n, "名称"]`
というコードは R の変数の値を文章に埋め込むためのものです。
Meta-information は次のように読みます。
- extype: num
- → この問題は1つの数値を解答する問題です。
- exsolution:
`r mnt[n, "標高 (m)"]`
- → この問題の解答は
mnt
データフレームのn
行目,“標高 (m)” 列のデータです。
- → この問題の解答は
- exname: → 問題を識別するための名前
- extol: 0
- → 許容誤差を指定する。0 は誤差を許さないという意味。
どのような問題が生成されるかは, exams2html()
という関数を使うとチェックできます。
library(exams)
exams2html("mountain-japan-num.Rmd")
これを LMS に取り込むには,例えば Moodle の場合は
exams2moodle("mountain-japan-num.Rmd")
とします。Moodle にインポート可能な XML ファイルが生成されるので,ウェブインターフェースを使ってアップロードしてください。
結果として次のような問題が生成されました。
次回の予定
この記事では,問題をランダムに1つ生成し,Moodle に取り込みました。4つある山のそれぞれについて,同じ構造の問題を作れますから,4通り全部について問題を作って Moodle にアップロードできると便利そうです。どのパターンをランダムに選ぶかは Moodle の方に任せることができます。