The package exams2forms
provides several building blocks
for embedding exercises written with the R package exams (also known as R/exams) in
interactive documents or quizzes written with rmarkdown or quarto.
The idea is that the dynamic exercises in R/exams' Rmd (R/Markdown) or Rnw (R/LaTeX) format can also be reused in HTML documents, web pages, or online books. This facilitates their use for self-paced learning and self-assessment without the need for a learning management system etc. And for (summative) assessments the same dynamic exercises could then be exported to different learning management systems or employed in written exams.
All R/exams exercise types are supported:
Many of the ideas as well as the code in the package have been adapted from the webexercises package, authored by Dale Barr and Lisa DeBruine.
As quick demonstration for R/exams exercises embedded into an HTML document, the two examples from the First Steps tutorial are included below: The single-choice exercise swisscapital and the numeric exercise deriv, both in three random variations.
What is the seat of the federal authorities in Switzerland (i.e., the de facto capital)?
There is no de jure capital but the de facto capital and seat of the federal authorities is Bern.
What is the seat of the federal authorities in Switzerland (i.e., the de facto capital)?
There is no de jure capital but the de facto capital and seat of the federal authorities is Bern.
What is the seat of the federal authorities in Switzerland (i.e., the de facto capital)?
There is no de jure capital but the de facto capital and seat of the federal authorities is Bern.
What is the derivative of \(f(x) = x^{7} e^{3.9 x}\), evaluated at \(x = 0.67\)?
Using the product rule for \(f(x) = g(x) \cdot h(x)\), where \(g(x) := x^{7}\) and \(h(x) := e^{3.9 x}\), we obtain \[ \begin{aligned} f'(x) &= [g(x) \cdot h(x)]' = g'(x) \cdot h(x) + g(x) \cdot h'(x) \\ &= 7 x^{7 - 1} \cdot e^{3.9 x} + x^{7} \cdot e^{3.9 x} \cdot 3.9 \\ &= e^{3.9 x} \cdot(7 x^6 + 3.9 x^{7}) \\ &= e^{3.9 x} \cdot x^6 \cdot (7 + 3.9 x). \end{aligned} \] Evaluated at \(x = 0.67\), the answer is \[ e^{3.9 \cdot 0.67} \cdot 0.67^6 \cdot (7 + 3.9 \cdot 0.67) = 11.860944. \] Thus, rounded to two digits we have \(f'(0.67) = 11.86\).
What is the derivative of \(f(x) = x^{4} e^{3.1 x}\), evaluated at \(x = 0.53\)?
Using the product rule for \(f(x) = g(x) \cdot h(x)\), where \(g(x) := x^{4}\) and \(h(x) := e^{3.1 x}\), we obtain \[ \begin{aligned} f'(x) &= [g(x) \cdot h(x)]' = g'(x) \cdot h(x) + g(x) \cdot h'(x) \\ &= 4 x^{4 - 1} \cdot e^{3.1 x} + x^{4} \cdot e^{3.1 x} \cdot 3.1 \\ &= e^{3.1 x} \cdot(4 x^3 + 3.1 x^{4}) \\ &= e^{3.1 x} \cdot x^3 \cdot (4 + 3.1 x). \end{aligned} \] Evaluated at \(x = 0.53\), the answer is \[ e^{3.1 \cdot 0.53} \cdot 0.53^3 \cdot (4 + 3.1 \cdot 0.53) = 4.343937. \] Thus, rounded to two digits we have \(f'(0.53) = 4.34\).
What is the derivative of \(f(x) = x^{5} e^{3.6 x}\), evaluated at \(x = 0.7\)?
Using the product rule for \(f(x) = g(x) \cdot h(x)\), where \(g(x) := x^{5}\) and \(h(x) := e^{3.6 x}\), we obtain \[ \begin{aligned} f'(x) &= [g(x) \cdot h(x)]' = g'(x) \cdot h(x) + g(x) \cdot h'(x) \\ &= 5 x^{5 - 1} \cdot e^{3.6 x} + x^{5} \cdot e^{3.6 x} \cdot 3.6 \\ &= e^{3.6 x} \cdot(5 x^4 + 3.6 x^{5}) \\ &= e^{3.6 x} \cdot x^4 \cdot (5 + 3.6 x). \end{aligned} \] Evaluated at \(x = 0.7\), the answer is \[ e^{3.6 \cdot 0.7} \cdot 0.7^4 \cdot (5 + 3.6 \cdot 0.7) = 22.440478. \] Thus, rounded to two digits we have \(f'(0.7) = 22.44\).
In addition to the question and the interaction element, there are three buttons providing the following functionality.
Button | Function |
---|---|
✓ | Check the answer and display whether it is correct or not. When clicked, the symbol is toggled and ↰ is displayed, which can be clicked to hide the solution again. |
? | Display the full correct solution explanation. |
↺ | Switch to the next question. |
Inclusion of the solution explanation is optional and the next question button is only displayed if there is more than one random variation of a question. The icons and mouseover text can also be adapted (see below).
To set up a similar standalone file with these two exercises, the
exams2qebquiz()
interface from the exams2forms
package can be used:
To showcase some more exercise types, the following examples from the R/exams package are used: capitals (multiple-choice), function (string/text), fruit (numeric with table and images), lm2 (cloze containing string, multiple-choice, numeric, and single-choice elements as well as an embedded data file).
Which of the following cities are the capital of the corresponding country?
What is the name of the R function for logistic regression?
glm
is the R function for logistic regression. See
?glm
for the corresponding manual page.
Given the following information:
\(+\) | \(+\) | = | \(508\) | |||
\(+\) | \(+\) | = | \(735\) | |||
\(+\) | \(+\) | = | \(203\) |
Compute:
\(+\) | \(+\) | = | \(\text{?}\) |
The information provided can be interpreted as the price for three fruit baskets with different combinations of the three fruits. This corresponds to a system of linear equations where the price of the three fruits is the vector of unknowns \(x\):
\(x_1 =\) | \(x_2 =\) | \(x_3 =\) |
The system of linear equations is then: \[ \begin{aligned} \left( \begin{array}{rrr} 0 & 2 & 1 \\ 1 & 0 & 2 \\ 2 & 1 & 0 \end{array} \right) \cdot \left( \begin{array}{r} x_1 \\ x_2 \\ x_3 \end{array} \right) & = & \left( \begin{array}{r} 508 \\ 735 \\ 203 \end{array} \right) \end{aligned} \] This can be solved using any solution algorithm, e.g., elimination: \[ x_1 = 59, \, x_2 = 85, \, x_3 = 338. \] Based on the three prices for the different fruits it is straightforward to compute the total price of the fourth fruit basket via:
\(+\) | \(+\) | = | ||||
\(x_1\) | \(+\) | \(x_2\) | \(+\) | \(x_3\) | = | |
\(59\) | \(+\) | \(85\) | \(+\) | \(338\) | = | \(482\) |
Theory: Consider a linear regression of
y
on x
. It is usually estimated with which
estimation technique (three-letter abbreviation)?
This estimator yields the best linear unbiased estimator (BLUE) under the assumptions of the Gauss-Markov theorem. Which of the following properties are required for the errors of the linear regression model under these assumptions?
Application: Using the data provided in linreg.csv
estimate a linear regression of y
on x
. What
are the estimated parameters?
Intercept:
Slope:
In terms of significance at 5% level:
Theory: Linear regression models are typically estimated by ordinary least squares (OLS). The Gauss-Markov theorem establishes certain optimality properties: Namely, if the errors have expectation zero, constant variance (homoscedastic), no autocorrelation and the regressors are exogenous and not linearly dependent, the OLS estimator is the best linear unbiased estimator (BLUE).
Application: The estimated coefficients along with
their significances are reported in the summary of the fitted regression
model, showing that y
increases significantly with
x
(at 5% level).
Call:
lm(formula = y ~ x, data = d)
Residuals:
Min 1Q Median 3Q Max
-0.66428 -0.16666 -0.00005 0.16780 0.53977
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.008474 0.026627 0.318 0.751
x 0.637386 0.046427 13.729 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.266 on 98 degrees of freedom
Multiple R-squared: 0.6579, Adjusted R-squared: 0.6544
F-statistic: 188.5 on 1 and 98 DF, p-value: < 2.2e-16
Code: The analysis can be replicated in R using the following code.
## data
d <- read.csv("linreg.csv")
## regression
m <- lm(y ~ x, data = d)
summary(m)
## visualization
plot(y ~ x, data = d)
abline(m)
Again, the exams2webquiz()
function can be used to set
up a standalone file based on the same exercises:
To accomplish the functionality demonstrated above, the package provides the following contents:
exams2forms()
: Main workhorse function from the
package. Like other exams2xyz()
interfaces this takes a
vector or list of exercise files and returns Markdown text, including
HTML snippets, than can be included in rmarkdown
or
quarto
documents. This includes questions, suitable
interactions for the different types of answers (with correct solutions
also embedded in the HTML), and optionally full solution
explanations.webex.css
, webex.js
: CSS (Cascading Style
Sheets) and Javascript files shipped within the package and providing
the code necessary for the exercise and quiz display and processing the
different types of interactions.webquiz()
: Small wrapper function that creates a
knitr::html_document()
but includes the CSS and Javascript
files above.exams2webquiz()
: Convenience interface that combines
all of the above elements. It sets up a webquiz()
document
in which exams2forms()
is used to embed the specified
exercises, calls rmarkdown::render()
to process it, and by
default displays it in the browser. This is most useful for quickly
trying out how R/exams exercises can work in HTML documents.forms_num()
, forms_string()
,
forms_schoice()
, forms_mchoice()
: Helper
functions for just embedding the user interactions for the different
types of exercises. Typically not called directly by the user.While exams2webquiz()
is convenient for quickly setting
up an HTML document containing certain exercises, further customizations
are typicallly needed for more elaborate documents. To demonstrate how
this works the exams2forms
package provides two demo
rmarkdown
files which can also be downloaded here:
The first file quiz.Rmd
renders a number of different
exercises into a quiz using a single exams2forms()
call,
indicating that the results
should be included
"asis"
:
---
title: "R/exams quiz"
output: exams2forms::webquiz
---
```{r setup, include = FALSE}
## package and list of various exercises
library("exams2forms")
exm <- list(
c("swisscapital.Rmd", "capitals.Rmd"),
"deriv.Rnw",
"deriv2.Rnw",
"fruit.Rmd",
"boxplots.Rmd",
"ttest.Rmd",
"function.Rmd",
"lm2.Rnw",
"fourfold2.Rmd"
)
```
```{r quiz, echo = FALSE, message = FALSE, results = "asis"}
exams2forms(exm, n = 3)
```
The questions.Rmd
file looks similar but contains
different sections, each with a single question set up via
exams2forms()
.
Both files can be rendered to HTML via
rmarkdown::render()
or by clicking the knit button after
opening the files in RStudio etc.
When setting up a more elaborate document or even a full webpage or
online book with rmarkdown
or quarto
, then the
simple webquiz()
HTML document provided by
exams2forms
is probably not sufficient. In this case, it is
best to take the CSS and Javascript files from the package or download
them here:
The files can then be placed in the same folder as the
rmarkdown
or quarto
project. They can also be
adapted relatively easily by changing the definitions of colors, icons,
text, etc. in the first few lines of each file.
To include the CSS and Javascript in an rmarkown
project, the YAML header should include:
output:
html_document:
css: webex.css
includes:
after_body: webex.js
Similarly, in a quarto
project the YAML header or the
_quarto.yml
file should include:
format:
html:
css: webex.css
include-after-body: webex.js
While it is not the primary focus of the exams2forms
package, it is also possible to directly include interaction forms in
documents like in the webexercises
package, i.e., without
setting up full R/exams exercises. A few simple examples are inlcuded
below for numeric, text, single-choice, and multiple-choice interactions
(both using drop-down interactions here), respectively.
What is the answer to the ultimate question of life, the universe, and everything?
Which superhero is the secret identity of Bruce Wayne?
Which of the following villains is not an adversary of Batman?
Which of the following characters are romantic interests of Spider-Man?
The corresponding code snippets included in the inline code chunks are:
forms_num(42, width = 10)
forms_string("Batman", width = 20, usecase = FALSE)
forms_schoice(c("Bane", "Riddler", "Thanos", "Poison Ivy"), c(FALSE, FALSE, TRUE, FALSE), display = "dropdown")
forms_mchoice(c("Mary Jane Watson", "Pepper Potts", "Selina Kyle", "Gwen Stacy"), c(TRUE, FALSE, FALSE, TRUE), display = "dropdown")