如何在targets动态分支中条件执行tar_target?
解决targets包中空分支目标的跳过问题
在使用targets包构建气象站数据处理工作流时,当识别到的问题站点(bad_stations)为空向量时,基于该目标的动态分支tar_target会报错:cannot branch over empty target。以下是具体的解决方法:
核心方案:用tar_if()条件控制分支目标的创建
借助tarchetypes包的tar_if()函数,根据问题站点向量的长度判断是否生成分支target。当向量为空时,直接跳过该target的执行,避免分支报错。
修改后的完整代码示例
library(targets) library(tarchetypes) data <- data.frame( id = rep(1:3, each = 10), val = runif(30) ) correct <- function(data) { data$val <- data$val * 10 return(data) } list( tar_target( ids, 1:3 ), tar_target( station_data, data[data$id == ids,], pattern = map(ids) ), # 模拟无问题站点的场景 tar_target( bad_stations2, ids[0] ), # 仅当存在问题站点时才创建分支target tar_if( condition = length(bad_stations2) > 0, tar_target( corrected_data2, correct(data[data$id == bad_stations2,]), pattern = map(bad_stations2) ) ) )
代码说明
tar_if()会根据condition的布尔结果决定是否将内部的tar_target纳入工作流:- 当
bad_stations2为空向量时,length(bad_stations2) > 0返回FALSE,corrected_data2会被完全跳过,不会触发分支操作,也就不会出现空分支报错。 - 当
bad_stations2包含有效站点ID时,条件成立,正常执行动态分支的数据修正流程。
- 当
备选方案:手动处理空分支场景(无需tarchetypes)
如果不想额外加载tarchetypes包,可以通过手动遍历+tar_skip()实现,不过这种方式需要放弃pattern的自动分支逻辑:
library(targets) library(purrr) data <- data.frame( id = rep(1:3, each = 10), val = runif(30) ) correct <- function(data) { data$val <- data$val * 10 return(data) } list( tar_target( ids, 1:3 ), tar_target( station_data, data[data$id == ids,], pattern = map(ids) ), tar_target( bad_stations2, ids[0] ), tar_target( corrected_data2, if (length(bad_stations2) == 0) { tar_skip() } else { map(bad_stations2, ~correct(data[data$id == .x,])) } ) )
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

