14.3 Exercises
Exercises are interactive R code chunks that allow readers to directly execute R code and see its results. We have shown a simple exercise in Figure 14.2.
Exercises can include hints or solutions as well as custom checking code to provide feedback on user answers.
14.3.1 Solutions
To create a solution to an exercise in a code chunk with the chunk label foo
, you add a new code chunk with the chunk label foo-solution
, e.g.,
```{r filter, exercise=TRUE}
# Change the filter to select February rather than January
nycflights <- filter(nycflights, month == 1)
```
```{r filter-solution}
nycflights <- filter(nycflights, month == 2)
```
When a solution code chunk is provided, there will be a Solution
button on the exercise (see Figure 14.3). Users can click this button to see the solution.

FIGURE 14.3: A solution to an exercise.
14.3.2 Hints
Sometimes you may not want to give the solutions directly to students, but provide hints instead to guide them. Hints can be either Markdown-based text content or code snippets.
To create a hint based on custom Markdown content, add a <div>
tag with an id
attribute that marks it as hint for your exercise (e.g., filter-hint
). For example:
```{r filter, exercise=TRUE}
# filter the flights table to include only United and
# American flights
flights
```
<div id="filter-hint">
`filter` function.
**Hint:** You may want to use the dplyr </div>
The content within the <div>
will be displayed underneath the R code editor for the exercise whenever the user presses the Hint
button.
If your Pandoc version is higher than 2.0 (check rmarkdown::pandoc_version()
), you can also use the alternative syntax to write the <div>
:
:::{#filter-hint}`filter` function.
**Hint:** You may want to use the dplyr :::
To create a hint with a code snippet, you add a new code chunk with the label suffix -hint
, e.g.,
```{r filter, exercise=TRUE}
# filter the flights table to include only United and
# American flights
flights
```
```{r filter-hint}
filter(flights, ...)
```
You can also provide a sequence of hints that reveal progressively more of the solution as desired by the user. To do this, create a sequence of indexed hint chunks (e.g., -hint-1
, -hint-2
, -hint-3
, etc.) for your exercise chunk. For example:
```{r filter, exercise=TRUE}
# filter the flights table to include only United and
# American flights
flights
```
```{r filter-hint-1}
filter(flights, ...)
```
```{r filter-hint-2}
filter(flights, UniqueCarrier == "AA")
```
```{r filter-hint-3}
filter(flights, UniqueCarrier == "AA" | UniqueCarrier == "UA")
```