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

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"))

验证步骤

  1. 先在R控制台运行上述修改后的代码块,确认fd能正常创建,logitModel拟合成功;
  2. 再用exams2nops重新生成试题,应该就能正常运行了。

内容的提问来源于stack exchange,提问作者djourd1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 10:42:48