Generate bordered tables with exams::exams2mooodle

July 24, 2020
R exams

Motivation

By default, tables in moodle problems created with exams::exams2moodle do not have table or cell borders. I want tables with borders!

If you does too, you might find this post useful.

Stylesheet

Create a style for a class you will use for tables. Note that this is not a CSS file but a HTML code snippet that you want to include in markdown files.

Instead of styling a class, it’s possible to style table tag itself. But I strongly discourage you from doing this. That will affect the appearance of other tables used in Moodle.

Make a problem with tables

Two important points:

  • Embed the style under the Question section. I would use something like writeLines(readLines("https://git.io/JJ4uR").
  • When you make a table, use HTML format and add the class attribute to the table tag (bordered-table). knitr::kable() has table.attr argument that does this for you.

Example

Here’s a sample problem.

```{r}
N <- 3

mountains <- 
  data.frame(
    Mountain = c("Everest", "K2", "Kangchenjunga", "Lhotse", "Makalu", 
                 "Cho Oyu", "Dhaulagiri", "Manaslu"),
    `Height (m)` = c(8848, 8611, 8586, 8516, 8485, 8188, 8167, 8163), 
    check.names = FALSE
  )

choice <- sample(nrow(mountains), N)

table <- mountains[choice, ]
table$`Height (m)` <- paste0("\\##ANSWER", seq_len(N), "##")

```

Question
========

```{r CSS, echo = FALSE, results = "asis"}
writeLines(readLines("https://git.io/JJ4uR"))
```

How high are the following mountains? Answer the height above sea level in meters. 

```{r question, echo = FALSE, results = "asis"}
knitr::kable(table, format = "html", 
             table.attr='class="bordered-table"',
             align = "lr",
             row.names = FALSE)
```

Solution
========

```{r solution, echo = FALSE, results = "asis"}
knitr::kable(mountains[choice, ], format = "html", 
             table.attr = 'class="bordered-table"',
             row.names = FALSE)
```

Meta-information
================

extype: cloze
exsolution: `r paste(mountains[choice, "Height (m)"], collapse = "|")`
exclozetype: `r paste(rep("num", 3), collapse = "|")`
exname: bordered-table
extol: 0
exextra[numwidth,logical]: TRUE

Result

You will get a quiz and solution that look like the following screenshots.

Quiz

quiz

Solution

solution