如何基于已有目标迭代创建targets::tar_target()类型新目标
解决方案
方案1:使用tarchetypes包的tar_eval()函数(官方推荐)
该工具是targets生态专门为批量生成target设计,静态分析可正确识别依赖,无需手动处理符号转换。
- 实现步骤:
- 先准备参数配置表,例如命名为
col_config,包含字段:col_name(新计算列名)、depend_table(依赖的已有target名称,字符串格式),以及替换NA、取对数、标准化等处理参数 - 先在
_targets.R中定义所有Oracle表对应的独立target - 批量生成计算列target的代码示例:
library(targets) library(tarchetypes) library(purrr) # 参数配置表示例 col_config <- tibble::tibble( col_name = c("col1", "col2", "col3"), depend_table = c("table_a", "table_b", "table_a"), replace_na = c(TRUE, FALSE, TRUE), log_transform = c(FALSE, TRUE, FALSE), z_score = c(TRUE, FALSE, TRUE) ) # 批量生成target compute_targets <- tar_eval( tar_target( name = !!rlang::sym(col_name), command = process_column( data = !!rlang::sym(depend_table), replace_na = replace_na, log_transform = log_transform, z_score = z_score ), format = "rds" ), values = col_config ) # 把所有target加入全局列表 list( # 已定义的Oracle表target tar_target(table_a, pull_oracle_data("schema.table_a"), format = "rds"), tar_target(table_b, pull_oracle_data("schema.table_b"), format = "rds"), # 批量生成的计算列target compute_targets )
- 原理:
tar_eval()会在静态分析阶段就把配置中的字符串参数替换为对应符号,targets的依赖检查可正确识别每个计算列对应的上游表target,不会出现依赖识别失败的问题。
方案2:手动构造target列表拼接
如果不想额外依赖tarchetypes,可以直接遍历配置表,将字符串转为符号后生成target对象,再拼接至全局target列表:
# 遍历配置表生成target列表 compute_targets <- pmap(col_config, function(col_name, depend_table, replace_na, log_transform, z_score) { tar_target( name = !!rlang::sym(col_name), command = process_column( data = !!rlang::sym(depend_table), replace_na = replace_na, log_transform = log_transform, z_score = z_score ), format = "rds" ) }) # 拼接至全局target列表即可 list( tar_target(table_a, pull_oracle_data("schema.table_a"), format = "rds"), tar_target(table_b, pull_oracle_data("schema.table_b"), format = "rds"), compute_targets )
注意事项
- 所有计算逻辑必须封装为纯函数,不要在target的command中写硬编码变量,避免依赖识别错误
- 可运行
tar_visnetwork()检查依赖关系,确认每个计算列的上游依赖和预期一致 - 单表数据量较大时,可在处理函数中只读取需要的字段,无需全表加载到内存,进一步优化内存占用
内容的提问来源于stack exchange,提问作者Emman
相关产品推荐
相关产品推荐

