使用R/exams在Canvas中渲染数值+MCQ混合题型的问题
解决R/exams制作兼容Canvas LMS的混合题型Cloze测验问题
问题核心
使用R/exams的Cloze格式制作包含数值题和单选题的随机测验,上传至Canvas后仅单选题能正常渲染,数值题无法被正确识别;拆分数值题单独制作时,上传后仅第一个题目显示文本输入框。
关键原因
- 题型类型配置错误:原示例中
extype设为num而非cloze,Canvas无法识别多子题的数值题结构; - 混合题型标记不规范:混合数值/单选题时,未在
exclozetype中明确指定每个子题的类型,Canvas无法解析不同题型的输入控件; - 导出格式适配问题:未使用Canvas原生支持的QTI 2.1格式导出,导致题型渲染异常。
解决方案
1. 严格配置Meta信息
必须设置extype: cloze,并通过exclozetype按顺序指定每个子题的类型(num为数值题,schoice为单选题),同时确保exsolution、extol、expoints等参数与子题数量匹配。
2. 规范题目标记与选项生成
- 数值题用
##ANSWER{n}##标记输入位置; - 单选题需生成带正确标记的选项列表,使用R/exams的
answerlist()输出符合格式的选项。
3. 完整混合题型Rmd示例
```{r, include=FALSE} # 生成混淆矩阵数据(原示例逻辑) lvs <- c("normal", "abnormal") truth <- factor(rep(lvs, times = c(86, 258)), levels = rev(lvs)) pred <- factor( c(rep(lvs, times = c(54, 32)), rep(lvs, times = c(27, 231))), levels = rev(lvs) ) library("caret") cm <- confusionMatrix(truth, pred) # 生成题目组件:4个数值题 + 1个单选题 questions <- solutions <- explanations <- points <- rep(list(""), 5) type <- c(rep("num", 4), "schoice") # 数值题配置 questions[[1]] <- "Accuracy:" solutions[[1]] <- explanations[[1]] <- round(as.numeric(cm$overall["Accuracy"]), 3) questions[[2]] <- "Sensitivity:" solutions[[2]] <- explanations[[2]] <- round(as.numeric(cm$byClass["Sensitivity"]), 3) questions[[3]] <- "Specificity:" solutions[[3]] <- explanations[[3]] <- round(as.numeric(cm$byClass["Specificity"]), 3) questions[[4]] <- "Cohen's Kappa:" solutions[[4]] <- explanations[[4]] <- round(as.numeric(cm$overall["Kappa"]), 3) # 单选题配置 questions[[5]] <- "Which metric reflects the model's ability to correctly identify abnormal cases?" solutions[[5]] <- c(FALSE, TRUE, FALSE, FALSE) # 第2个选项为正确答案 explanations[[5]] <- "Sensitivity measures the proportion of actual abnormal cases correctly identified by the model." # 单选选项 choices <- c("Accuracy", "Sensitivity", "Specificity", "Kappa") points[c(1:5)] <- 1 tol <- 0.001
Question
异常类为关注类(需要干预的病例)。朋友开发的分类模型结果如下:
library("kableExtra") tab <- cm$table colnames(tab) <- c("实际异常", "实际正常") rownames(tab) <- c("预测异常", "预测正常") knitr::kable(tab, "html", align = ('lrrr'), booktabs=T) |> kable_styling(bootstrap_options = c("striped","hover"), full_width = FALSE) |> add_header_above(c(" ", "混淆矩阵" = 2))
请完成以下任务:
# 输出数值题标记 for(i in 1:4){ cat(paste0(questions[[i]], " ##ANSWER", i, "##\n\n")) } # 输出单选题 cat(paste0(questions[[5]], "\n\n")) answerlist(choices, markup = "markdown")
Solution
# 数值题解答 for(i in 1:4){ cat(paste0(questions[[i]], " ", explanations[[i]], "\n\n")) } # 单选题解答 cat(paste0(questions[[5]], "\n\n")) answerlist(paste0(choices, ifelse(solutions[[5]], " (正确)", "")), markup = "markdown") cat("\n", explanations[[5]], sep = "")
Meta-information
extype: cloze
exsolution: r paste(c(solutions[1:4], paste(ifelse(solutions[[5]], "1", "0"), collapse = "")), collapse = "|")
exclozetype: r paste(type, collapse = "|")
extol: r paste(rep(tol, 4), collapse = "|") # 仅数值题需要容差,单选可留空或省略
expoints: r paste(points, collapse = "|")
exname: Mixed_Cloze_Quiz
### 4. 正确导出至Canvas 使用`exams2qti21()`函数导出,这是Canvas支持的标准格式: ```r exams2qti21("your_quiz_file.Rmd", output_dir = "qti_output", name = "canvas_quiz")
将导出的qti_output文件夹压缩为ZIP包,上传至Canvas的"导入测验"功能即可。
验证要点
- 导出后检查QTI文件中每个子题的
interaction类型:数值题对应textEntryInteraction,单选题对应choiceInteraction; - 上传前可通过Canvas的"预览测验"功能确认所有题型渲染正常。
内容的提问来源于stack exchange,提问作者Jaslene Lin
相关产品推荐
相关产品推荐

