求助:targets包tar_map()的values参数无法识别已有target的问题
解决tar_map引用上游target作为values的问题
问题原因
原代码报错object 'config' not found,是因为tar_map的values参数在target定义阶段就会被求值,此时config这个target还未运行,无法获取其值。而用tar_read(config)虽然能拿到值,但不会在targets的依赖图谱中注册依赖,导致config更新时,下游的result targets不会自动重新运行。
正确解决方案
使用tarchetypes::tar_eval()包裹values的定义,让targets识别上游依赖并延迟求值到运行阶段,同时保留依赖追踪:
library(targets) tar_script({ library(tarchetypes) list( tar_target(config, c("a", "b", "c")), tar_map( values = tar_eval(list(configs = config), config), tar_target(result, paste0(configs, "1")) ) ) }) tar_make()
适配配置文件需求
如果要让终端用户仅修改配置文件即可更新参数,可将config target改为读取外部配置文件(如YAML/CSV),无需修改代码:
- 创建配置文件
config.yaml:
items: ["a", "b", "c"]
- 修改target脚本:
library(targets) tar_script({ library(tarchetypes) library(yaml) list( tar_target(config, yaml::read_yaml("config.yaml")$items), tar_map( values = tar_eval(list(configs = config), config), tar_target(result, paste0(configs, "1")) ) ) })
这样用户只需编辑config.yaml中的参数列表,即可更新tar_map的values,无需改动R代码。
内容的提问来源于stack exchange,提问作者Josep Pueyo
相关产品推荐
相关产品推荐

