R/exams含schoice与num的cloze题型容差边界配置异常问题咨询
混合题型cloze容差设置错位解决方案
问题根因
R/exams的\extol参数要求容差向量的长度和全部cloze子题的总数量一致,顺序和子题的先后顺序完全对应,而非仅匹配数值题的顺序。非数值类子题(如schoice单选)的容差会被系统自动忽略,仅需占位即可。
你遇到的错位问题来源于两个错误:
- 子题总共有3道(1道单选+2道数值题),但你初始化的
tol向量最终长度仅为2位,和子题数量不匹配 - 容差的索引对应错误:你想给第二道数值题(总排序第3道子题)设置0.01容差,却赋值给了
tol[2],该位置对应总排序第2道子题(第一道数值题),最终生成的容差序列顺序完全颠倒。
修正后代码
R逻辑部分
<<echo=FALSE, results=hide>>= # 子题类型:1道单选 + 2道数值题,总长度3 type <- c("schoice", "num", "num") solutions <- explanations <- rep(list(""), 3) # 各题答案赋值 solutions[[1]] <- c(1, 0, 0) solutions[[2]] <- 0 solutions[[3]] <- 1/8 # 单选选项处理 explanations[type=="schoice"] <- lapply(solutions[type=="schoice"], function(x) ifelse(x, "True", "False")) solutions[type=="schoice"] <- lapply(solutions[type=="schoice"], mchoice2string) # 关键:tol长度和子题总数一致,按子题先后顺序赋值 # 第1位对应单选占位填0,第2位对应空房人数题容差0,第3位对应1/8计算题容差0.01 tol <- c(0, 0, 0.01) @
试题和元数据部分
\begin{question} What is the capital of Italy? \begin{answerlist} \item Rome \item Madrid \item Berlin \item How many people live in a empty house? \item Compute 1/8. (tolerance: \Sexpr{tol[3]}). \end{answerlist} \end{question} %% META-INFORMATION %% \extype{cloze} %% \exclozetype{\Sexpr{paste(type, collapse = "|")}} %% \exsolution{\Sexpr{paste(solutions, collapse = "|")}} %% \exname{prova_tol} %% \extol{\Sexpr{paste(tol, collapse = "|")}}
修正效果
生成的Moodle试题将符合预期:
- 空房居住人数题容差为0:
{1:NUMERICAL:=0:0} - 1/8计算题容差为0.01:
{1:NUMERICAL:=0.125:0.01}
内容的提问来源于stack exchange,提问作者user12703198
相关产品推荐
相关产品推荐

