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

