--- title: "Building Reproducible Data Science Assignments" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Building Reproducible Data Science Assignments} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set(collapse = TRUE, comment = "#>") ``` Data science assignments are easier to maintain when the instructor can keep one source document and regenerate student-facing materials after revisions. `tutorizeR` supports that workflow by converting annotated source documents into tutorials with exercises and solutions. ## Suggested assignment structure ```text assignment-week03/ lesson-source.qmd data/ student_activity.csv generated/ week03-tutorial.Rmd conversion-report.json ``` ## Reproducible conversion script ```{r eval=FALSE} library(tutorizeR) assignment_dir <- file.path(tempdir(), "assignment-week03") output_dir <- file.path(assignment_dir, "generated") source_file <- file.path(assignment_dir, "lesson-source.qmd") report <- tutorize( input = source_file, output_dir = output_dir, format = "learnr", assessment = "both", seed = 20260531, overwrite = TRUE, lint_strict = TRUE ) write_tutorize_report( report = report, file = file.path(output_dir, "conversion-report.json"), format = "json" ) ``` ## Why the seed matters For teaching workflows, a fixed seed makes generated setup chunks reproducible. This is useful when students, teaching assistants, and instructors need to see the same randomized example or simulated dataset. ## LMS manifest ```{r eval=FALSE} library(tutorizeR) assignment_dir <- file.path(tempdir(), "assignment-week03") output_dir <- file.path(assignment_dir, "generated") manifest <- export_lms_manifest( input = file.path(assignment_dir, "lesson-source.qmd"), output_file = file.path(output_dir, "lms-manifest.json"), profile = "canvas", include_solutions = FALSE ) print(manifest) ``` The manifest is a local metadata artifact. Direct LMS publication is not part of the current package functionality.