R/Exams结合Canvas New Quizzes:题库分组与个性化测验工作流咨询
R/Exams + Canvas New Quizzes 实操指南
整体工作流
- 编写单题型Rmd模板:包含随机化逻辑、题干、答案、元数据(知识点、所属组等)
- 用R批量生成多版本试题并打包为QTI文件:通过
exams2qti21指定试题组、测验规则 - 导入QTI包到Canvas:直接生成带规则的测验或归入库
- 少量收尾操作:验证配置、发布测验
用R指定题库/试题组与测验参数
1. 给试题标记组属性
在Rmd的YAML元数据里添加tags或category,用来指定试题所属的组/题库,示例:
title: "矩阵逆运算选择题" tags: ["线性代数", "矩阵", "期中测验组1"] category: "期中测验题库"
生成QTI时这些元数据会被保留,导入Canvas后自动归类到对应组。
2. 批量生成同题型多版本并归组
用循环或lapply生成多版本试题,再通过exams2qti21统一指定组信息:
set.seed(456) # 固定随机种子保证可复现 # 生成10个版本的矩阵试题 matrix_items <- lapply(1:10, function(i) { exams::xercise("matrix_inverse.Rmd", name = paste0("matrix_inv_q", i)) }) # 生成带组信息的QTI包 exams2qti21(matrix_items, name = "期中测验-矩阵组", meta = list(category = "期中测验题库", tags = ["组1"]), directory = "./canvas_qti")
导出的ZIP包导入Canvas后,所有试题会自动进入指定的题库/组。
3. 直接生成带测验规则的QTI包
通过quiz参数在R里配置测验层面的规则,比如抽题数量、时间限制、总分:
# 假设已经生成了组1、组2的试题列表 all_items <- c(matrix_items, vector_items) exams2qti21(all_items, name = "2024线性代数期中测验", quiz = list( title = "线性代数期中测验", description = "从每个知识点组抽取1题,共2题,限时60分钟", time_limit = 60, # 单位:分钟 questions = list( list(category = "组1", count = 1), # 从组1抽1题 list(category = "组2", count = 1) # 从组2抽1题 ), scoring = list(total_points = 10) ), directory = "./quiz_qti")
这个ZIP包导入Canvas后,会直接创建一个已配置好规则的测验,无需手动设置抽题、时间等。
Canvas端最少化手动操作
- 导入QTI包:在New Quizzes里选「Import」,上传生成的ZIP文件即可
- 验证配置:导入后检查试题组归类、测验规则是否符合预期,偶尔微调分值(若R参数和Canvas格式有细微差异)
- 发布测验:设置发布时间、可见范围,这一步目前无法通过R自动完成,需手动操作
注意事项
- 务必使用最新版
exams包:对Canvas New Quizzes的QTI 2.1支持更完善,减少兼容性问题 - 先单题测试:先导出单个试题的QTI,导入Canvas确认格式正确后再批量处理
- 元数据统一:Rmd里的
category/tags要和Canvas的题库名称对应,避免归类错误
内容的提问来源于stack exchange,提问作者Vinh Nguyen
相关产品推荐
相关产品推荐

