如何使用tar_make()缓存保存在rds文件中的文件列表?
解决方案
这个需求完全可以实现,targets本身支持缓存所有R对象类型,包括列表,报错和存储对象为列表没有直接关系。
报错根因
- 函数命名冲突:你同时加载
readr和tidyverse后,裸写的read_rds()出现了命名空间调度错误,被错误匹配到了需要col_types入参的文本读表函数,才会出现参数不匹配的报错。 - 全局变量未纳入依赖管理:你在全局环境定义的
path变量没有被targets识别为依赖,targets运行在独立环境中,这类游离的全局变量容易触发隐性错误。 - 外部文件读取写法不规范:没有将本地rds文件标记为文件类型依赖,后续文件修改后targets无法自动感知重新运行。
调整后可运行代码
library(targets) # 配置流水线依赖包 tar_option_set(packages = c("readr", "tidyverse")) list( # 定义文件路径,标记为文件类型target,自动追踪文件变动 tar_target( rds_file, fs::path("", "Volumes", "My_folder", "filename.rds"), format = "file" ), # 读取完整列表存入缓存 tar_target( df_list, readRDS(rds_file) # 直接用base R的readRDS避免函数冲突,也可替换为readr::read_rds(rds_file) ), # 如需读取列表内单个元素,单独声明target即可 tar_target( single_df, df_list[["i"]] ) ) # 启动流水线 tar_make()
注意事项
- 调用读取函数时尽量加显式命名空间(比如
readr::read_rds()),不要直接写裸函数名,避免多包加载时的同名函数覆盖问题。 - 所有外部输入文件都建议加
format = "file"标记为文件target,targets会自动检测文件修改时间,文件更新后自动重新运行下游依赖,比手动拼路径的写法稳定很多。 - 不要在流水线列表外定义供target调用的全局变量,所有用到的对象、路径都要声明为独立target,避免环境隔离导致的对象找不到问题。
内容的提问来源于stack exchange,提问作者RCchelsie
相关产品推荐
相关产品推荐

