Skip to contents

Tools for creating homework assignments and solutions using RMarkdown.

Motivation

Writing homework assignments for students in the age of RMarkdown necessitates the creation of two separate documents – assign.Rmd and soln.Rmd. The goal of assignr is to create one document main.Rmd that can be broken apart into the above two documents. Thus, there is no longer a need to copy and paste between the assign and the soln documents as all of the contents are together in one file.

Example workflow with assignr

Installation

assignr is only available via GitHub.

To install the package from GitHub, you can type:

install.packages("devtools")

devtools::install_github("coatless-rpkg/assignr")

Usage

To use assignr, create an Rmd file named WXYZ-main.Rmd, where WXYZ could be hw00. Within the file, add to your code chunks one of the following chunk options:

  1. solution = TRUE
    • to mark a solution
  2. directions = TRUE
    • to indicate directions

When specifying text directions that should not appear in the solution file, use the latter chunk option, and set the code chunk engine to asis, e.g.

```{asis name, directions = TRUE}
The goal of the following exercise is... 
```

Then, in R, run:

# Render output
assignr("hw00-main.Rmd")

Example Output:

hw00
├── hw00-assign
│   ├── hw00-assign.Rmd
│   ├── hw00-assign.html
│   ├── hw00-assign.pdf
│   └── hw00-assign.zip
└── hw00-soln
    ├── hw00-soln.Rmd
    ├── hw00-soln.html
    ├── hw00-soln.pdf
    └── hw00-soln.zip

Previews of what is contained in each file are shown next.

Instructor Main

In the main file, denoted as *-main.Rmd, all content – including solutions – should be placed. As an example of contents, please see the hw00-main.Rmd document that ships with the package.

---
title: 'Homework X'
author: "Prof. Name"
date: 'Due: Friday, Month Day by 1:59 PM CDT'
output:
  html_document:
    theme: readable
    toc: yes
---

# Exercise 1 (Introductory `R`)

```{asis, directions = TRUE}
For this exercise, we will create a couple different vectors.
```

**(a)** Create two vectors `x0` and `x1`. Each should have a
length of 25 and store the following:

- `x0`: Each element should be the value `10`.
- `x1`: The first 25 cubed numbers, starting from `1.` (e.g. `1`, `8`, `27`, et cetera)

```{asis, solution = TRUE}
**Solution:**
```

```{r, solution = TRUE}
x0 = rep(10, 25)
x1 = (1:25) ^ 3
```

Student Assignment

Within this section, the assignment rmarkdown file given to students is displayed.

---
title: 'Homework X'
author: "Prof. Name"
date: 'Due: Friday, Month Day by 1:59 PM CDT'
output:
  html_document:
    theme: readable
    toc: yes
---

# Exercise 1 (Introductory `R`)

For this exercise, we will create a couple different vectors.

**(a)** Create two vectors `x0` and `x1`. Each should have a
length of 25 and store the following:

- `x0`: Each element should be the value `10`.
- `x1`: The first 25 cubed numbers, starting from `1.` (e.g. `1`, `8`, `27`, et cetera)

PDF Rendering of hw00-assign.Rmd

Solutions

Lastly, we have the assignment rmarkdown file that contains the solutions and their respective output.

---
title: 'Homework X'
author: "Prof. Name"
date: 'Due: Friday, Month Day by 1:59 PM CDT'
output:
  html_document:
    theme: readable
    toc: yes
---

# Exercise 1 (Introductory `R`)


**(a)** Create two vectors `x0` and `x1`. Each should have a
length of 25 and store the following:

- `x0`: Each element should be the value `10`.
- `x1`: The first 25 cubed numbers, starting from `1.` (e.g. `1`, `8`, `27`, et cetera)

**Solution:**

```{r, solution = TRUE}
x0 = rep(10, 25)
x1 = (1:25) ^ 3
```

PDF Rendering of hw00-soln.Rmd

Authors

James Joseph Balamuta and David Dalpiaz

License

GPL (>= 2)