使用purrr::when()为tidymodels workflow加模型后类变为Functional sequence问题
解决R6类中创建默认线性回归Workflow时对象类型变为Functional sequence的问题
问题原因
你使用的magrittr::when()函数会返回函数式序列(Functional sequence),而非直接将操作应用到workflow()对象上。这个函数的设计目的是创建可复用的函数链,不是立即执行管道内的操作,因此最终wf不是预期的workflow对象,导致后续步骤无法执行。
解决方案
用标准的if-else条件判断替代when(),直接对workflow对象进行操作,确保最终得到合法的workflow实例。
基础示例
library(tidymodels) model <- NULL wf <- workflow() if (!is.null(model)) { wf <- wf %>% add_model(model) } else { wf <- wf %>% add_model( linear_reg() %>% set_mode("regression") %>% set_engine("lm") ) } # 验证对象类型 class(wf) # 输出:"workflow" "R6"
在R6类中集成
将逻辑放到R6类的初始化方法或自定义方法中,示例如下:
library(tidymodels) library(R6) MyWorkflow <- R6Class( "MyWorkflow", public = list( wf = NULL, # 初始化方法,支持传入自定义模型,默认用线性回归 initialize = function(model = NULL) { self$wf <- workflow() if (!is.null(model)) { self$wf <- self$wf %>% add_model(model) } else { self$wf <- self$wf %>% add_model( linear_reg() %>% set_mode("regression") %>% set_engine("lm") ) } }, # 示例:添加公式的方法 add_workflow_formula = function(formula) { self$wf <- self$wf %>% add_formula(formula) invisible(self) } ) ) # 测试使用 my_wf <- MyWorkflow$new() # 可正常执行后续workflow操作 my_wf$add_workflow_formula(mpg ~ .) print(my_wf$wf)
内容的提问来源于stack exchange,提问作者Buoyant Xu
相关产品推荐
相关产品推荐

