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

如何在tarchetypes::tar_hook_outer()钩子中正确引用已计算目标?

问题

需要将已计算完成的Suffix目标作为参数传入tarchetypes::tar_hook_outer()调用的钩子函数中,但运行tar_make()时出现object 'Suffix' not found错误。示例_targets.R代码如下:

postprocess <- function(the_target, arg) {
  paste(the_target, arg)
}

list(
  targets::tar_target(Suffix, "--postprocessed"),
  targets::tar_target(A, "A")
) |>
  tarchetypes::tar_hook_outer(
    hook = postprocess(.x, arg = Suffix),
    names = "A"
  )

运行tar_make()后的错误信息:

── 最后错误消息 ───────────────────────────────────────────────────
object 'Suffix' not found

── 最后错误回溯 ─────────────────────────────────────────────────
postprocess("A", arg = Suffix)
paste(the_target, arg)
.handleSimpleError(function (condition) { state$error <- build_mess...
h(simpleError(msg, call))

期望目标A的最终值为"A--postprocessed",且该模式在2024年8月可行,tarchetypes 0.10.0(2024-09-26)版本引入tarchetypes::tar_hook_outer_raw()后行为被破坏。

解决方案

方法一:使用targets::tar_get()读取目标值

修改钩子函数,通过tar_get()从targets的项目存储中读取已计算完成的Suffix目标值,该函数能在targets运行时正确获取目标结果:

postprocess <- function(the_target) {
  # 使用tar_get()获取Suffix的计算值
  paste(the_target, targets::tar_get(Suffix))
}

list(
  targets::tar_target(Suffix, "--postprocessed"),
  targets::tar_target(A, "A")
) |>
  tarchetypes::tar_hook_outer(
    hook = postprocess(.x),
    names = "A"
  )

方法二:使用tar_hook_outer_raw()保留依赖解析

新版本的tar_hook_outer()改变了求值逻辑,改用tar_hook_outer_raw()可以直接传递原始表达式,让targets自动解析Suffix的依赖关系,确保它在钩子执行前完成计算:

postprocess <- function(the_target, arg) {
  paste(the_target, arg)
}

list(
  targets::tar_target(Suffix, "--postprocessed"),
  targets::tar_target(A, "A")
) |>
  tarchetypes::tar_hook_outer_raw(
    hook = postprocess(.x, arg = Suffix),
    names = "A"
  )

方法三:显式传递目标名并读取

如果需要更灵活地指定目标,可以将目标名作为字符串传入钩子函数,再用tar_read()读取值:

postprocess <- function(the_target, arg_target_name) {
  paste(the_target, targets::tar_read(arg_target_name))
}

list(
  targets::tar_target(Suffix, "--postprocessed"),
  targets::tar_target(A, "A")
) |>
  tarchetypes::tar_hook_outer(
    hook = postprocess(.x, arg_target_name = "Suffix"),
    names = "A"
  )

以上三种方法都能让钩子函数正确获取Suffix的计算值,最终目标A会得到预期的"A--postprocessed"结果。


内容的提问来源于stack exchange,提问作者Matthew Kuperus Heun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:23:17