You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用R/exams在Canvas中渲染数值+MCQ混合题型的问题

解决R/exams制作兼容Canvas LMS的混合题型Cloze测验问题

问题核心

使用R/exams的Cloze格式制作包含数值题和单选题的随机测验,上传至Canvas后仅单选题能正常渲染,数值题无法被正确识别;拆分数值题单独制作时,上传后仅第一个题目显示文本输入框。

关键原因

  1. 题型类型配置错误:原示例中extype设为num而非cloze,Canvas无法识别多子题的数值题结构;
  2. 混合题型标记不规范:混合数值/单选题时,未在exclozetype中明确指定每个子题的类型,Canvas无法解析不同题型的输入控件;
  3. 导出格式适配问题:未使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 15:15:12