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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 08:08:28