The markmyassignment
package is a tool to for teachers to set up testthat test suites for R programming labs or exams.
The package is a wrapper for testthat
test suites and a single assignment yml file online govern a lab or an exam. Students set the assignment they want to work with using set_assignment()
. Then all test suites and assignment information are downloaded and stored in the tempdir()
folder of the current R session. The students can then easily test their assignments with the function mark_my_assignment()
or mark_my_file()
.
markmyassignment
makes it easy for students to get automatic feedback on their lab assignments (or exams) with very limited overhead. The only thing the students need are: - an URL to the assignment yml file online or locally, - internet connection and - markmyassignment
installed on their local computer.
The main purpose of the package is two-fold. First, making it possible for students to test their own assignments improve the learning since a good test suite guides the students toward problems in their code. The package also considerably speeds up the time it takes to correct labs for teachers.
The package has been used at Linkoping University, Sweden, since 2013 in multiple R courses (advanced and beginners courses). The package has been very popular among students.
The easiest way to install the package in R is as follows:
All documentation of the package and the functionality can be found using:
See the students vignette for markmyassignment here or in R:
To use markmyassignment
in a course, the following steps are needed.
testthat
for tasks in the labThe first step is to create a lab. =) Then produce unit tests using the testthat
package for the assignments the students should turn in.
If the task is to create a numeric vector with the values pi
and e
an example test file can be found here.
In a similar way, one or more mandatory test files can be used for testing of the overall lab file. One example is that there can be mandatory for students to supply a character element name
the students name. An example test file can be found here.
The next step is to put all tasks together to a full assignment. This is a collection of test files and mandatory test files. The assignment files is in yaml format and consists of the root nodes name
(assignment name), description
(assignment description), tasks
(tasks in assignments as separate nodes) and mandatory
(optional, with URLs to mandatory test).
A working template with descriptions of each part can be found here. The assignment can be set with:
set_assignment("https://github.com/MansMeg/markmyassignment/blob/master/inst/extdata/assignment_template.yml")
Give the URL to the assignment file to the students.
See the students vignette for markmyassignment here or in R:
All solutions from the students can be collected and marked automatically. The assignment to test needs to be set with set_assignment()
. The mark_my_dir()
function can then be used for the directory with the student solutions. The function returns a data.frame
with one row per unit test file and lab file. In this way, multiple files can be marked at the same time. Of course, some manual check is needed as well.
In marking of student lab files there are some extra exceptions included in markmyassignment
with the purpose of testing student assignment. The included expectations are:
expect_attached_package
expect_function_arguments
expect_function_code
expect_function_self_contained
expect_no_attached_forbidden_package
expect_no_forbidden_function_code
expect_package
expect_self_contained
See the documentation for each function for further information and usage.
Since markmyassignment
is in essence just a wrapper for testthat
, it is simple to choose your own argument for test_dir()
using ...
in mark_my_assignment()
. As an example, to use the testthat summary reporter in testing the student assignment, just write:
It is possible to use basic authentication to access private http URLs (for example to test assignments without making them public). This is done by simply adding a httr
authentication to the set_assignment()
function. Here is an example of how to use a private repo on github: