R Markdown逐块执行与编织结果不一致问题求助
问题解决:R Markdown编织PDF时表格结果重复
问题现象
在RStudio中逐块执行代码、执行「Run All」都能得到正确的不同指标表格,但编织生成PDF时,两个模型的指标表格结果完全一致,仿佛代码块未重新计算。已尝试设置cache=FALSE、使用不同数据框名称、局部环境计算,均无效。
核心原因
- 滞后变量未生成:第二个模型需要用到滞后项
GT_{i,t-1},但代码中从未在combined_data里创建lag1_开头的列,导致x2全为NA,执行na.omit(df4)后,数据框只剩y和x1,模型退化为与第一个模型完全相同的GDP_t ~ GT_{i,t},结果自然重复。 - 全局变量复用风险:循环中使用的
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)
验证方法
- 清空全局环境后,重新编织文档,检查两个表格的指标是否不同。
- 单独运行第二个模型的代码块,确认
df4中x2列不再全为NA,模型确实包含两个自变量。
内容的提问来源于stack exchange,提问作者Stefan Nicov
相关产品推荐
相关产品推荐

