Generating a random order for students to select their internships (or anything really)
By automatically retrieving the list of students from Canvas
R script to generate random numbers merged with a list of student names retrieved from Canvas
My students have to choose where they want to have their internship in societal psychology. Since some internships seems to be more popular, I make a random list of numbers from
1:number of students which I then merge with the list of student names retrieved from Canvas. This then becomes the order in which the students select their internships.
Since I do this twice per semester every year, I made this (highly overengineered) solution using R.
# Load libraries require(tidyverse) # For data management require(rcanvas) # To connect to Canvas require(openxlsx) # To output to MS Excel require(readr) # To output to csv
Get userinfo for specific course
You will need to input the id for the specific course you want to retrieve student info from. I have added a
YOURID placeholder to indicate where this has to be entered. See my previous post for how to retrieve all your Canvas courses, and for how to search that list for a specific course. You will also have to add your Canvas access token and the correct server before you can continue. This was described in my previous post.
rcanvas::get_course_items() functions has options to get only the students, but in my case this does not retrieve their email addresses. I therefore retrive all users in the course, then the students, and then merge the email address with the students names using
If you require it, you also have a simple way of making a list with the same information for teachers using a
# Get info for all users Canvas list_of_users <- get_course_items( course_id = YOURID, item = "users", include = "email" ) # Get only students, but no email so we must merge list_of_students <- get_course_items( course_id = YOURID, item = "students", include = "email" ) # Merge in the email adress students_with_email <- dplyr::inner_join(list_of_students, select(list_of_users, login_id, email), by = "login_id", copy = F ) # Need a list of teachers as well? # teachers_with_email <- dplyr::anti_join( # list_of_users, list_of_students, by = "id" # )
Generate the random numbers
# Generate a random number from 1:the number of students draw_order <- sample(1: length(students_with_email$name), length(students_with_email$name)) # Merge the random string of numbers with the dataframe containing student info students_with_email_number <- cbind(students_with_email, draw_order) # Order the lsit of students by their placement in the draw students_with_email_number <- students_with_email_number %>% arrange(draw_order)
Save the resulting data frame to Excel and csv.
Since I will publish this list back to Canvas, I only retain the name of the students and their placement in the draw in the files that I store. I use
dplyr::select() to keep only these two variables.
# as xls students_with_email_number %>% select(name, draw_order) %>% openxlsx::write.xlsx(., "yourfile.xlsx") # as csv students_with_email_number %>% select(name, draw_order) %>% readr::write_csv(., "yourfile.csv")