We’ve been moving to a “standards-based mindset” (props to Schimmer for a great book!) in our assessment and grading over the past couple of years and have begun collecting student performance data using a variety of methods. We’ve tried Active Grade (now a part of Haiku) and JumpRope, which are very full featured standards-based gradebooks, but without a full fledged institutional commitment - i.e., everyone grading fully on standards - it’s difficult to justify the cost of additional software, especially when we are already using Instructure Canvas as our LMS. The goal is to provide feedback using standards, but not transition to a standards-based report card.

Canvas provides a standards-based solution called the Learning Mastery Gradebook, which pulls data from outcomes aligned to assignment rubrics. These outcomes can be organized into outcome groups within a course, then reported to students through the normal “Grades” interface. Outcome scores can be calculated using a variety of methods; the one we prefer is the simplified “decaying average” which favors the most recent assessment point by whatever percent you specify, with the remainder of the score being made up of the average of the rest of the previous assessment points.

Our desired approach involves unpacking curricular standards, or power standards, into specific “learning targets”. In Canvas, power standards correspond to outcome groups, while learning targets correspond to individual outcomes. Ultimately, we want to provide students with scores on both learning targets and power standards - something Canvas currently doesn’t do.

I’ve created a little app using Python that leverages the Canvas API to pull data from a user’s course and the Learning Mastery Gradebook, restructure it, calculate a mean outcome group score, then send students a templated message in their Canvas inbox with their results. I think this will be a functional bridge between what Canvas currently offers and products like JumpRope, which are marketed as standards-based gradebooks and not as an LMS.

I’m very interested in collaborating with others who want to hack the LMG like this - particularly someone who has some experience creating GUIs using Tkinter in Python. The app is currently very ugly; I didn’t pay much attention to how buttons were laid out. Just figuring out how Canvas structured the response data was challenging enough!

Send me an email or tweet me @CITBrian if you’re interested in improving and extending the functionality of the app!

rcanvas continues to grow. Thanks to the recent contributions from Chris Hua, getting user groups, announcements, and discussions from your institution’s Canvas instance has never been easier. More collaborators are welcome!

By my lights, R package development should be attuned to the tidyverse. Piping output into a sequence of clear, logical functions not only makes for clean, readable code, but is an undeniably damned good time.

The remainder of this post will showcase the interplay between the tidyverse and various rcanvas functions.

Getting Missing Assignments

Here's how to get all missing assignments for a course, multiple courses, students, or multiple students. Again, the code flow is intuitive. First, get the courses. Second, filter the course(s) you want. Third, pipe the course ids into `purrr::map_df`, and fourth, extend the pipe with user ids into `get_user_items`.