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

动态定义targets依赖:外部CSV变更触发Excel目标重建问题

解决targets流水线中动态CSV文件依赖Excel生成的问题

问题背景

存在一个sheets子文件夹,存放着外部生成的CSV文件(名称、数量均不固定),需要生成包含所有CSV内容的Excel文件。要求调用tar_make()时,若CSV文件被修改或新增,流水线自动重建Excel文件。

现有代码的问题

之前的尝试虽然为每个CSV文件创建了file_fast类型的target,但最终的Excel target没有明确依赖这些动态生成的target,而是直接在代码中调用list.files()读取文件。这种方式下,targets无法追踪CSV文件的变化,导致依赖关系失效。

解决方案代码

修改_targets.R,通过收集所有CSV文件的target集合来建立明确的依赖关系:

library(targets)
library(openxlsx)

tar_option_set(packages = "openxlsx")

# 1. 获取sheets文件夹下的所有CSV文件(仅文件名)
csv_filenames <- list.files("sheets", pattern = "\\.csv$", full.names = FALSE)

# 2. 为每个CSV文件创建file_fast类型的target,追踪文件变化
csv_targets <- lapply(csv_filenames, function(fn) {
  tar_target_raw(
    name = fn,
    command = file.path("sheets", fn),
    format = "file_fast"
  )
})

# 3. 创建一个集合target,汇总所有CSV文件的路径,作为Excel目标的依赖
csv_collection <- tar_target(
  all_csv_files,
  c(!!!csv_filenames), # 引用所有CSV target的名称,建立依赖
  format = "rds"
)

# 4. 最终的Excel生成target,依赖csv_collection
excel_target <- tar_target(
  result.xlsx,
  {
    # 读取所有依赖的CSV文件
    csv_data_list <- lapply(all_csv_files, read.csv, stringsAsFactors = FALSE)
    # 为工作表命名(去掉.csv后缀)
    names(csv_data_list) <- tools::file_path_sans_ext(basename(all_csv_files))
    # 写入Excel文件
    write.xlsx(csv_data_list, "result.xlsx")
    "result.xlsx" # 返回文件路径,符合file类型target要求
  },
  format = "file"
)

# 组合所有targets
list(
  csv_targets,
  csv_collection,
  excel_target
)

关键说明

  1. 依赖关系建立:all_csv_files target会自动依赖所有单个CSV的target,而result.xlsx依赖all_csv_files,确保任何CSV文件修改时,Excel会自动重建。
  2. 新增CSV的处理:当sheets文件夹新增CSV文件时,重新运行tar_make()即可——targets会在解析阶段重新扫描文件列表,生成新的CSV target。
  3. 避免运行时动态扫描:不再在Excel target的代码中调用list.files(),而是通过依赖集合传递文件路径,让targets能精准追踪文件变化。

内容的提问来源于stack exchange,提问作者Karsten W.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 09:23:14