knitr::opts_chunk$set(echo = TRUE)
library(dplyr) # library(rmdgrader) library(econDS) library(tidyverse) library(googledrive) .root <- function(){ "/Users/martinl/Github/course-dashboard-programming-for-data-science" } datafilename <- file.path(.root(),params$gradingFolder,params$title,"data4step3.Rdata") load(datafilename, envir = .GlobalEnv) correctAnsFilename = file.path( .root(), params$ansfilename ) gradeSavingFilename <- file.path(.root(),params$gradingFolder,params$title,"data4step4.Rdata") load(gradeSavingFilename, envir=.GlobalEnv) returnFolder <- file.path(.root(), params$submissionFolder, params$title, "return") problemFolder <- file.path(returnFolder, "cannotSynthesized") copy2returnGDfolderFilename = file.path(.root(), params$gradingFolder, params$title, "data4step5.Rdata") classDriveFolderPath = params$classDriveFolderPath if(!dir.exists(problemFolder)) dir.create(problemFolder) ansLabels <- colnames(tb_grades %>% select(contains("ans"))) load( file.path( .root(),"109-1-completeRoster.Rdata"), envir = .GlobalEnv ) if(!dir.exists(returnFolder)) dir.create(returnFolder)
pe <- Process() pe$inBatch_studentsRmds$tryGet_list_codeChunks() only4HW8 ={ purrr::walk( seq_along(pe$studentsRmds), ~{ names(pe$studentsRmds[[.x]]$codeChunksProcessed$list_codeChunks) %>% stringr::str_replace("ans12", "ans12.") %>% stringr::str_replace("ans13", "ans13.") %>% stringr::str_replace("data12", "data12.") %>% stringr::str_replace("data13", "data13.") -> names(pe$studentsRmds[[.x]]$codeChunksProcessed$list_codeChunks) } ) } pe$correctAnsFilename$tryGet_list_codeChunks()
re <- Return(pe, returnFolderpath = params$localGDReturnFolderPath) # generate a template from correct ans Rmd as a holder to fill in student's codes re$template$generate_holder() # generate students returnRmd in batch re$inBatch$generate_returnRmd() # Each student's returnRmd lines will be: re$studentRmds$HW8_410672033.Rmd$returnRmd$lines
You can also generate only one student's returnRmd at a time:
# Generate one student's returnRmd lines re$studentRmds$HW8_410674270.Rmd$returnRmd_generate()
Once returnRmd lines are generated, user can return them in batch:
re$inBatch$return() # If regret, user can delete them in batch as well: re$inBatch$delete()
Individual return/delete is also possible:
# return to one student: re$studentRmds$HW8_410672033.Rmd$returnRmd$return() # if somehow user regret, he/she can delete it: re$studentRmds$HW8_410672033.Rmd$returnRmd$delete()
deadline <- lubridate::today()+lubridate::days(7) content <- { glue::glue("問題反應截止日期: {deadline} 請用以下格式來寫:(一人請只留一則訊息,裡頭包含你所有的問題,否則會影響後續的程式處理) --- 學號:411073007 ans11 我的答案是 .... 但.....(陳述內容自定) ans31 我的答案是.... 但 ....(陳述內容自定)") } title = glue::glue("{params$title} 批改方式問題") post_disputeIssue2Github( repoUrl = params$disputeGithub, title=title, content=content ) -> response
THIS IS DONE ONLY ONCE EACH SEMESTER to setup each student's return folder:
result_setupIndividualReturnFolder = { gd_returnFolderIndividuals <- create_individualGoogleDriveReturnFolder(classDriveFolderPath, roster) gd_returnFolderIndividuals_shared <- share_gdReturnFolders(gd_returnFolderIndividuals) destfile = file.path( .root(), params$gradingFolder, params$title, "gd_returnFolderIndividuals_shared.Rdata" ) save(gd_returnFolderIndividuals_shared, file=destfile) gd_returnFolderIndividuals_shared }
replacement <- list( studentname="謝琪", examTitle="Midterm1", grade="10") contentTemplate <- "{studentname}同學好, \n你的{examTitle}成績是{grade}。\n祝學習愉快\n茂廷老師" #' Generate content with keywords replaced with values defined in replacement object #' #' @param contentTemplate A character vector of content template, keywords to be replaced must formed as `{keyword}` as it is taken care by glue::glue() #' @param replacement A list of keyword=value pairs #' #' @return #' @export #' #' @examples none. generate_emailContent <- function(contentTemplate, replacement){ contentTemplate <- paste0(contentTemplate, collapse="\n") with( replacement, glue::glue(contentTemplate) ) } generate_emailContent(contentTemplate, replacement)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.