在targets工作流中使用pointblank包时出现找不到数据表的问题
问题原因及解决方案
核心问题
你遇到的报错是因为YAML配置中的公式引用~my_data会在全局环境查找对象,但targets的每个目标都在独立临时环境中执行,全局环境不存在该对象。单独执行时my_data在当前会话的全局环境里,所以能正常运行,但targets管道环境不共享全局变量,因此找不到。
解决方案
方法1:修改校验函数,绑定传入的数据源
修改validate_data函数,在读取YAML后手动将传入的my_data设置为agent的数据源,覆盖YAML中的全局引用:
validate_data <- function(my_data, qc_yaml_file) { yaml_read_agent(qc_yaml_file) |> set_tbl(tbl = my_data) |> # 替换agent的数据源为函数参数传入的my_data interrogate() }
方法2:生成YAML时不预先绑定数据源
如果想让校验规则更通用,可以在创建agent时不指定固定的tbl,后续在函数中动态绑定:
- 修改YAML生成代码:
create_agent( tbl = NULL, # 不预先绑定数据源 label = "check on mtcars", actions = action_levels( warn_at = 0.10, stop_at = 0.25 ) ) |> col_exists(columns = c(cyl, vs, am, gear, carb)) |> yaml_write(filename = "check_mtcars.yaml")
- 同样使用方法1中的
validate_data函数,动态传入数据源。
验证修改
修改后运行tar_make(),targets管道会正常执行:
my_data和yaml_file会先被生成qc_results目标中,agent会使用传入的my_data执行校验,不再依赖全局环境
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

