tar_make()遇深层嵌套函数错误时无限停滞问题求助
排查targets包tar_make()无限挂起的可能原因
结合你提供的信息,以下是几种可能导致tar_make()/tar_make_future()挂起的原因:
错误捕获逻辑冲突:targets通过
error = "null"和workspace_on_error = TRUE设置了错误处理规则,但深层包函数的错误抛出可能使用了非标准逻辑(比如自定义条件类、嵌套的withCallingHandlers),导致targets无法正确捕获并处理错误,进而阻塞流程。顶层函数直接调用stop()时,错误符合标准R错误格式,能被targets正常处理。隔离环境下的资源未释放:targets在独立环境中运行目标,而深层包函数可能持有未关闭的资源(如文件连接、临时对象锁)。当错误发生时,这些资源无法被自动清理,导致targets在尝试保存工作空间或终止进程时陷入等待。交互式运行时,会话级的资源管理能自动处理这类问题。
动态分支的错误通信阻塞:你的
results目标使用了动态分支,当某个分支的深层函数抛出错误时,分支进程与主进程的通信可能被中断。如果错误导致分支进程无法向主进程发送终止信号,主进程会一直等待该分支完成,最终整个流程挂起。workspace_on_error的保存阻塞:启用
workspace_on_error = TRUE后,targets需要在错误发生时保存整个工作空间。深层函数的错误可能导致某些对象无法被序列化(比如包含活跃连接的对象),序列化过程陷入无限循环,进而导致整个进程挂起。
你的配置文件代码:
# _targts.R # all workflow functions are in package:wp.batch # package wp.batch imports package wp.analysis library(targets) library(wp.batch) library(future) targets::tar_option_set(packages = "wp.batch", error = "null", workspace_on_error = TRUE) plan("sequential") alts = c("first", "second") list(tar_target(config_file, "test_debug.xlsx", format = "file"), tar_target(config, read_batch_config(config_file, alts)), tar_target(data, data_workflow(config), pattern = map(config)), tar_target(results, analysis_workflow(data), pattern = map(data)), tar_target(plots, plot_workflow(results), pattern = map(results), deployment = "main"))
交互式运行的错误回溯:
# backtrace when running `analysis_workflow(data)` interactively Backtrace: ▆ 1. ├─wp.batch::analysis_workflow(data) 2. │ ├─dplyr::mutate(...) 3. │ └─dplyr:::mutate.data.frame(...) 4. │ └─dplyr:::mutate_cols(.data, dplyr_quosures(...), by) 5. │ ├─base::withCallingHandlers(...) 6. │ └─dplyr:::mutate_col(dots[[i]], data, mask, new_columns) 7. │ └─mask$eval_all_mutate(quo) 8. │ └─dplyr (local) eval() 9. └─purrr::map2(.data$data, .data$analysisInputs, analysis_factory) 10. └─purrr:::map2_("list", .x, .y, .f, ..., .progress = .progress) 11. ├─purrr:::with_indexed_errors(...) 12. │ └─base::withCallingHandlers(...) 13. ├─purrr:::call_with_cleanup(...) 14. └─wp.batch (local) .f(.x[[i]], .y[[i]], ...) 15. ├─base::do.call(summary_analysis, c(data, unlist(inputs, recursive = FALSE))) 16. └─wp.analysis (local) `<fn>`(df = `<tibble[,8]>`, metrics = NA_character_, type = "metric by duration") 17. └─wp.analysis:::analysis_duration(...) 18. └─base::stop("analysis_duration() not implemented")
内容的提问来源于stack exchange,提问作者mikeck
相关产品推荐
相关产品推荐

