R/exams加载真实数据集时出现'fd'对象未找到错误求助
解决
exams2nops报错object 'fd' not found的问题 我之前也碰到过一模一样的情况——单独编译Rmd文件完全正常,但用exams2nops生成试题就报变量找不到的错,核心问题和exams包的执行环境机制有关,结合你的代码咱们一步步排查解决:
为什么会出现这个报错?
exams包在批量生成试题时,会为每一份试题创建独立的临时执行环境,和你在控制台单独跑代码的环境是相互隔离的:
- 人工数据的示例里,
d是在同一个代码块里直接生成的,所以能被临时环境正常识别; - 但真实数据集是从外部
d.Rdata加载的,如果加载时没有明确绑定到临时环境,d可能没有被正确加载进来,后续创建fd的代码找不到依赖的d,自然就报错了。
另外也有可能是你d.Rdata里保存的对象名称根本不是d(比如存数据时不小心改了名字),这也会导致后续代码找不到数据。
具体解决方案
1. 显式指定数据加载的环境
修改数据加载代码,把d.Rdata明确加载到当前代码块的执行环境中,确保exams的临时环境能拿到这个对象:
{r data generation, echo = FALSE, results = "hide"} # 显式指定加载到当前代码块的环境 current_env <- environment() load("d.Rdata", envir = current_env) # 后续抽样和建模代码保持不变 nsize <- sample(180:250, 1) sampled_dat <- sample(1:nrow(d), nsize, replace = TRUE) fd <- d[sampled_dat, ] logitModel <- glm(Adopted ~ CultArea + Trained + LabRice+ Education + ExtContact, data = fd, family=binomial("logit"))
2. 先确认d.Rdata里的对象名称
先在R控制台单独执行以下代码,检查加载的对象到底叫什么:
load("d.Rdata") ls() # 查看加载的所有对象名称
如果输出里没有d,比如对象名是rice_survey_data,那就要把代码里所有用到d的地方改成对应的名字,比如:
sampled_dat <- sample(1:nrow(rice_survey_data), nsize, replace = TRUE) fd <- rice_survey_data[sampled_dat, ]
3. 用函数封装数据加载逻辑(更稳妥)
把数据加载、抽样的逻辑封装成一个函数,强制变量在同一个环境中流转,彻底避免环境隔离的问题:
{r data generation, echo = FALSE, results = "hide"} prepare_model_data <- function() { load("d.Rdata") nsize <- sample(180:250, 1) sampled_idx <- sample(1:nrow(d), nsize, replace = TRUE) return(d[sampled_idx, ]) } fd <- prepare_model_data() logitModel <- glm(Adopted ~ CultArea + Trained + LabRice+ Education + ExtContact, data = fd, family=binomial("logit"))
验证步骤
- 先在R控制台运行上述修改后的代码块,确认
fd能正常创建,logitModel拟合成功; - 再用
exams2nops重新生成试题,应该就能正常运行了。
内容的提问来源于stack exchange,提问作者djourd1
相关产品推荐
相关产品推荐

