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

R Markdown逐块执行与编织结果不一致问题求助

问题解决:R Markdown编织PDF时表格结果重复

问题现象

在RStudio中逐块执行代码、执行「Run All」都能得到正确的不同指标表格,但编织生成PDF时,两个模型的指标表格结果完全一致,仿佛代码块未重新计算。已尝试设置cache=FALSE、使用不同数据框名称、局部环境计算,均无效。

核心原因

  1. 滞后变量未生成:第二个模型需要用到滞后项GT_{i,t-1},但代码中从未在combined_data里创建lag1_开头的列,导致x2全为NA,执行na.omit(df4)后,数据框只剩y和x1,模型退化为与第一个模型完全相同的GDP_t ~ GT_{i,t},结果自然重复。
  2. 全局变量复用风险:循环中使用的model等变量未做局部隔离,knitr编织时的求值机制可能导致变量被意外覆盖。

修复步骤

步骤1:生成滞后变量

在数据合并后,为每个趋势类别添加滞后1期的列:

# 生成滞后1期的变量(基础R实现,无需额外包)
for (category in categories) {
  combined_data[[paste0("lag1_", category)]] <- c(NA, head(combined_data[[category]], -1))
}

步骤2:优化循环逻辑,避免全局变量污染

用函数式编程替代for循环,同时保留原类别名称作为列名(不要手动改为1-10,避免混淆):

第一个模型的优化代码

# 模型:GDP_t ~ GT_{i,t}
metrics_df3 <- lapply(categories, function(category) {
  df <- data.frame(
    y = combined_data$gdp,
    x = combined_data[[category]]
  )
  model <- lm(y ~ x, data = df)
  predicted <- predict(model, df)
  c(
    summary(model)$r.squared,
    mae(df$y, predicted),
    rmse(df$y, predicted),
    mape(df$y, predicted),
    smape(df$y, predicted),
    mase(df$y, predicted)
  ) %>% round(2)
}) %>% do.call(cbind, .) %>% 
  as.data.frame() %>% 
  mutate(Metric = c("Adjusted R^2", "MAE", "RMSE", "MAPE", "sMAPE", "MASE")) %>% 
  relocate(Metric)

colnames(metrics_df3)[-1] <- categories

kable(metrics_df3)

第二个模型的优化代码

# 模型:GDP_t ~ GT_{i,t} + GT_{i,t-1}
metrics_df4 <- lapply(categories, function(category) {
  df <- data.frame(
    y = combined_data$gdp,
    x1 = combined_data[[category]],
    x2 = combined_data[[paste0("lag1_", category)]]
  ) %>% na.omit()
  model <- lm(y ~ x1 + x2, data = df)
  predicted <- predict(model, df)
  c(
    summary(model)$r.squared,
    mae(df$y, predicted),
    rmse(df$y, predicted),
    mape(df$y, predicted),
    smape(df$y, predicted),
    mase(df$y, predicted)
  ) %>% round(2)
}) %>% do.call(cbind, .) %>% 
  as.data.frame() %>% 
  mutate(Metric = c("Adjusted R^2", "MAE", "RMSE", "MAPE", "sMAPE", "MASE")) %>% 
  relocate(Metric)

colnames(metrics_df4)[-1] <- categories

kable(metrics_df4)

步骤3:确保knitr设置正确

保留cache=FALSE的设置,同时添加自动依赖检测:

knitr::opts_chunk$set(echo = FALSE, cache = FALSE, autodep = TRUE)

验证方法

  1. 清空全局环境后,重新编织文档,检查两个表格的指标是否不同。
  2. 单独运行第二个模型的代码块,确认df4中x2列不再全为NA,模型确实包含两个自变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 14:04:51