使用R targets包处理新增PDF文件时目标跳过问题求助
解决targets包中新增PDF文件未触发管道更新的问题
问题背景
每月会有新PDF文件添加到指定目录,使用R的targets包构建数据管道提取文件信息,现有代码如下:
list( tar_target( "data_path", list.files(path = "dir", full.names = T) ), tar_target( "data_pdf_raw", read_pdf(data_path), pattern = map(data_path) ), tar_target( "data_pdf_clean", clead_pdf(data_pdf_raw[[1]]), pattern = map(data_pdf_raw) ), tar_target( "data_to_sql", data_to_sql(data_pdf_clean) ) )
遇到的问题:目录新增文件后,targets仍跳过data_path目标,无法获取最新文件列表。尝试过给data_path设置format="file"、新增额外目标等方法均无效,且因PDF数量多,不想每次重新处理所有文件。
解决方案
1. 正确监测目录文件变化
targets不会自动监测list.files的输出变化,需先监测目录本身,再基于目录更新文件路径列表:
# 监测目标目录的内容变化 tar_target( dir_monitor, "dir", # 替换为你的实际目录路径 format = "file" ), # 仅当目录内容变化时,重新生成文件路径列表 tar_target( data_path, list.files(path = dir_monitor, full.names = TRUE), trigger = trigger(change = dir_monitor) )
dir_monitor通过format="file"让targets监测目录的内容变更(新增/删除文件都会触发哈希值变化)trigger(change = dir_monitor)确保data_path只在目录变化时重新运行,避免无意义的重复执行
2. 修正映射目标的处理逻辑
原代码中data_pdf_clean存在两处问题:函数名拼写错误(clead_pdf应为clean_pdf)、错误使用[[1]](map(data_path)后每个data_pdf_raw是单个文件的处理结果,无需索引)。修正后:
# 分文件读取PDF,仅处理新增/修改的文件 tar_target( data_pdf_raw, read_pdf(data_path), pattern = map(data_path), format = "rds" # 缓存读取结果,加速后续运行 ), # 分文件清理PDF数据 tar_target( data_pdf_clean, clean_pdf(data_pdf_raw), pattern = map(data_pdf_raw), format = "rds" )
pattern = map(data_path)为每个PDF文件生成独立子目标,仅当对应文件变化时才重新处理format="rds"缓存处理后的结果,避免重复处理未变更的文件
3. 合并结果写入SQL
data_to_sql可直接接收所有清理后的结果列表,无需额外处理:
tar_target( data_to_sql, data_to_sql(data_pdf_clean) )
完整代码
list( # 监测目标目录 tar_target( dir_monitor, "dir", format = "file" ), # 获取最新文件路径列表 tar_target( data_path, list.files(path = dir_monitor, full.names = TRUE), trigger = trigger(change = dir_monitor) ), # 读取PDF文件 tar_target( data_pdf_raw, read_pdf(data_path), pattern = map(data_path), format = "rds" ), # 清理PDF数据 tar_target( data_pdf_clean, clean_pdf(data_pdf_raw), pattern = map(data_pdf_raw), format = "rds" ), # 将数据写入SQL tar_target( data_to_sql, data_to_sql(data_pdf_clean) ) )
内容的提问来源于stack exchange,提问作者Pierre
相关产品推荐
相关产品推荐

