使用purrr::possibly与pmap创建Workflow时未按预期容错的问题
问题分析
你遇到的问题根源在于模型规格创建阶段就触发了报错,而非workflow构建阶段。当调用linear_reg() %>% set_engine("gee")时,若gee包未安装,这一步会直接抛出错误,导致整个create_model_spec生成的tibble无法正常创建,后续的pmap容错自然无法生效。另外,possibly的作用范围可能没覆盖到真正出错的环节。
解决方案
1. 先确保模型规格的创建是容错的
修改create_model_spec,对gee模型的规格创建做容错处理,避免因包未安装直接中断整个函数:
library(tidymodels) library(purrr) create_model_spec <- function() { # 对gee模型的规格创建做容错,创建失败则返回NULL gee_spec <- possibly( ~ linear_reg() %>% set_engine("gee"), otherwise = NULL )() # lm模型正常创建 lm_spec <- linear_reg() %>% set_engine("lm") tibble( model_id = c("gee_lm", "lm_lm"), model_spec = list(gee_spec, lm_spec) ) %>% # 过滤掉创建失败的模型规格(比如gee的NULL) filter(!map_lgl(model_spec, is.null)) }
2. 修正workflow构建的容错逻辑
在make_wflw_obj中,确保每个workflow的构建过程被possibly包裹,同时处理可能的NULL模型规格:
make_wflw_obj <- function(model_recipe, model_spec_tbl) { # 定义单个workflow构建函数,包含容错 build_wflw <- possibly( function(rec, spec) { workflow() %>% add_recipe(rec) %>% add_model(spec) }, otherwise = NULL ) # 用pmap逐个构建,自动跳过无效的模型规格 model_spec_tbl %>% mutate(workflow = pmap(list(model_spec), ~ build_wflw(model_recipe, ..1))) %>% # 过滤掉构建失败的workflow filter(!map_lgl(workflow, is.null)) }
3. 验证逻辑
当gee包未安装时,gee_spec会被设为NULL,在后续过滤中被剔除,仅lm对应的workflow会成功创建;若安装了gee包,则两个workflow都会正常生成。
关键要点
- 容错要前置:在创建模型规格时就处理包未安装的情况,避免后续流程被中断。
- 精准包裹出错环节:把
possibly用在单个模型规格创建、单个workflow构建的最小单元上,而非整个批量处理过程。 - 过滤无效项:生成结果后过滤掉NULL的模型规格或workflow,确保最终输出均为有效项。
内容的提问来源于stack exchange,提问作者MCP_infiltrator
相关产品推荐
相关产品推荐

