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

如何在不重复运行代码的情况下knit R Markdown文件

R Markdown 避免knit时重复运行耗时代码的实现方案

完全可以实现,核心逻辑是把数据清洗、模型训练这类高耗时步骤的输出持久化存储,knit时优先调用已存储的结果,仅在结果不存在或上游逻辑变更时才重新计算,具体可根据使用习惯选以下方案:

  • 方案1:原生R手动存读对象(兼容性最好,无额外依赖)
    所有R对象(数据框、模型输出、表格对象等)都可以用saveRDS()存为本地.rds文件,ggplot等图形对象可以用ggsave()、png()等函数存为本地图片文件。在代码块开头加文件存在性判断:如果本地已有对应结果文件就直接加载,没有才执行耗时计算逻辑。
    示例代码:

    # 提前创建好用于存结果的output文件夹
    clean_data_path <- "output/cleaned_analysis_data.rds"
    lm_model_path <- "output/fit_lm_model.rds"
    
    # 数据处理部分
    if (!file.exists(clean_data_path)) {
      # 此处放原始数据导入、清洗的耗时代码
      raw_df <- read.csv("raw/large_survey_data.csv")
      clean_df <- raw_df[!is.na(raw_df$response), ]
      saveRDS(clean_df, clean_data_path)
    } else {
      clean_df <- readRDS(clean_data_path)
    }
    
    # 模型训练部分
    if (!file.exists(lm_model_path)) {
      fit_model <- lm(response ~ age + gender + income, data = clean_df)
      saveRDS(fit_model, lm_model_path)
    } else {
      fit_model <- readRDS(lm_model_path)
    }
    

    如果修改了数据处理或模型代码,只要删掉对应的.rds文件,下次运行就会自动重新计算生成新结果,不会误用旧缓存。

  • 方案2:R Markdown自带缓存功能(操作最简便,无需手动写存读逻辑)
    给耗时的代码块添加cache=TRUE的块选项,knit时会自动将该块的所有运行结果存在本地缓存目录中,下次knit如果检测到该块代码没有修改,就直接调用缓存结果,不会重复执行。
    常用块参数配置:

    # 给数据处理块开缓存,块命名为data_process
    {r data_process, cache=TRUE}
    # 数据导入、清洗代码
    
    # 模型块依赖data_process块,上游块改动时本块缓存自动失效重跑
    {r model_fit, cache=TRUE, dependson="data_process"}
    # 模型训练代码
    

    如果代码块依赖外部原始数据文件,可以加cache.extra = file.mtime("raw/")参数,监控原始数据文件夹内的文件修改时间,原始数据更新时自动触发缓存更新。

  • 方案3:计算流程与报告文档分离(适合大型项目)
    把数据导入、清洗、建模、预绘图所有耗时步骤全部拆到独立的R脚本中,在knit文档之前就提前跑完所有计算流程,把最终报告需要用到的所有对象、图片、表格统一存到指定结果目录。R Markdown文档里只写结果加载、表格格式化、报告正文内容,knit时完全不涉及重计算,速度最快。
    用这个方案建议给结果文件加上更新时间戳或者版本号,避免报告引用过时的旧结果。

注意:以上方案都不会影响报告复现性,需要全量重跑验证结果时,只要清空所有缓存文件/存储的结果文件,再执行knit就会从头运行所有代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:57:51