动态定义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 )
关键说明
- 依赖关系建立:
all_csv_filestarget会自动依赖所有单个CSV的target,而result.xlsx依赖all_csv_files,确保任何CSV文件修改时,Excel会自动重建。 - 新增CSV的处理:当
sheets文件夹新增CSV文件时,重新运行tar_make()即可——targets会在解析阶段重新扫描文件列表,生成新的CSV target。 - 避免运行时动态扫描:不再在Excel target的代码中调用
list.files(),而是通过依赖集合传递文件路径,让targets能精准追踪文件变化。
内容的提问来源于stack exchange,提问作者Karsten W.
相关产品推荐
相关产品推荐

