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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:24:18