You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:15:32