关于R/exams中nops_pdf字符串题合并.rds后评估异常的技术问询
问题:合并nops_pdf生成的.rds文件后字符串题无法准确评估
我创建了多个nops_pdf考试,生成了包含考试信息的多个.rds文件。通常使用以下代码合并这些.rds文件:
## readRDS all *.rds files in the current working directory x <- lapply(Sys.glob("exam/*.rds"), readRDS) ## combine all resulting lists y <- do.call("c", x) ## saveRDS into a single .rds file saveRDS(y, "exam/all.rds")
但此次每个考试包含两道字符串题,合并.rds文件的过程看似正常,运行nops_eval()函数后却发现字符串题无法被准确评估,只能通过单个.rds文件和对应扫描件逐一修正。请问出现该异常的原因是什么?
原因分析与解决方案
核心原因:错误的合并方式破坏了nops考试对象的结构
你当前使用的do.call("c", x)是将每个.rds文件中考试对象的内部元素直接平铺合并成一个大列表,而非保留多个独立的考试对象作为列表元素。而nops_eval()需要接收的是一个包含完整考试对象的列表,这种拆解式的合并会彻底打乱nops的内部数据结构:
- 不同考试中的同名内部元素(比如
$questions、$solutions、$meta)会被后续考试的元素覆盖,导致字符串题的评估规则(如参考答案、匹配逻辑、题目ID映射)丢失或混淆; - 合并后的结构不再符合nops识别考试的格式,
nops_eval()无法将扫描件与对应的考试题目正确关联,自然无法准确评估字符串题。
正确的合并代码
无需拆解考试对象的内部结构,直接保存lapply返回的列表即可(该列表本身就是由多个独立考试对象组成的):
# 读取所有.rds文件,得到包含多个完整考试对象的列表 x <- lapply(Sys.glob("exam/*.rds"), readRDS) # 直接保存这个列表,保留每个考试的独立结构 saveRDS(x, "exam/all.rds")
额外验证建议
合并后可以先检查结构是否正确:
# 查看合并后列表的长度(应等于你生成的考试数量) length(readRDS("exam/all.rds")) # 查看第一个考试对象的结构,确认包含完整的考试元数据和题目信息 str(readRDS("exam/all.rds")[[1]], max.level = 1)
内容的提问来源于stack exchange,提问作者Sinval
相关产品推荐
相关产品推荐

