Skip to content

Instantly share code, notes, and snippets.

@vanatteveldt
Last active November 7, 2019 15:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vanatteveldt/50c378f8b8c04736767d301e172c2530 to your computer and use it in GitHub Desktop.
Save vanatteveldt/50c378f8b8c04736767d301e172c2530 to your computer and use it in GitHub Desktop.
library(rcanvas)
library(tidyverse)
# helder function that gets a query, does pagination, but doesn't process
get_raw = function (endpoint, args = NULL, method = "GET") {
endpoint = paste(endpoint, collapse = "/")
if (!grepl("^https?://", endpoint))
endpoint = paste0(rcanvas:::canvas_url(), endpoint)
resp <- rcanvas:::canvas_query(endpoint, args, "GET")
rcanvas:::paginate(resp) %>% purrr::map(httr::content, "text") %>%
purrr::map(jsonlite::fromJSON, flatten = TRUE)
}
set_canvas_token("...") # login bij canvas, account, settings, integrations (eenmalig)
set_canvas_domain("https://canvas.vu.nl")
course = 42370
assignment = 69450
rubric_name = "Beoordeling thuisopdracht"
# Get all submissions
submissions = rcanvas::do_query(str_c("/courses/",course,"/assignments/", assignment, "/submissions/")) %>%
as_tibble() %>% select(asset_id=id, user_id, workflow_state)
# Add usernames
users = rcanvas::get_course_items(course,item="enrollments") %>% as_tibble
names = users %>% select(user_id=user.id, studentnr=sis_user_id, name=user.name) %>% unique
submissions = submissions %>% left_join(names)
# 1. get comment texts per author (=commenter)
# note that this data is a bit weird, the primary df has multiple rows per assignment, for which comments are then duplicated
# so, take only the comments per author from primary df, and join with unique comments from nested dfs in comments column
comments_raw = rcanvas::do_query(str_c("/courses/",course,"/assignments/", assignment,"/peer_reviews"), args=list(include="submission_comments")) %>% as_tibble
comments_text = comments_raw$submission_comments
names(comments_text) = comments_raw$asset_id
comments_text = as_tibble(bind_rows(comments_text, .id = "asset_id")) %>%
mutate(asset_id=as.integer(asset_id)) %>% select(asset_id, grader_id=author_id, comment) %>% unique
# add comments from the same user together
comments_text = comments_text %>% group_by(asset_id, grader_id) %>% summarize(comment=paste(comment, collapse = "\n\n"))
# identify rubric
all_rubrics = rcanvas::do_query(str_c("/courses/", course, "/rubrics")) %>% as_tibble
rubric_id = all_rubrics$id[all_rubrics$title == "Beoordeling thuisopdracht"]
if (length(rubric_id) != 1) stop("Cannot find rubric id")
# get scores
assessments = get_raw(str_c("/courses/", course, "/rubrics/", rubric_id), args=list(include="assessments"))[[1]]$assessments
assessments = assessments %>% select(asset_id=artifact_id, grader_id=assessor_id, score) %>% as_tibble
c = submissions %>%
left_join(comments_text) %>%
left_join(assessments) %>%
left_join(names %>% rename(grader_id=user_id, grader_nr=studentnr, grader_name=name))
c = c %>% group_by(asset_id) %>% mutate(i=row_number())
gradernrs = c %>% select(asset_id, grader_nr, i) %>% mutate(i=str_c("gradernr_", i)) %>% spread(i, grader_nr)
gradernames = c %>% select(asset_id, grader_name, i) %>% mutate(i=str_c("gradername_", i)) %>% spread(i, grader_name)
scores = c %>% select(asset_id, score, i) %>% mutate(i=str_c("score_", i)) %>% spread(i, score)
comments = c %>% select(asset_id, comment, i) %>% mutate(i=str_c("comment_", i)) %>% spread(i, comment)
submissions %>% left_join(gradernrs) %>% left_join(gradernames) %>% left_join(scores) %>% left_join(comments) %>%
select(asset_id:name,
gradernr_1, gradername_1, score_1, comment_1,
gradernr_2, gradername_2, score_2, comment_2,
gradernr_3, gradername_3, score_3, comment_3,
gradernr_4, gradername_4, score_4, comment_4) %>% write_csv("camiel.csv")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment