You need to enable JavaScript to run this app. 如何给fable包的model函数传入字符串形式的模型定义?
优惠活动
大模型
产品
解决方案
定价
更多

如何给fable包的model函数传入字符串形式的模型定义?

fable包传入字符串形式模型定义的解决方法

报错原因

fable的model()函数要求接收命名的模型表达式作为参数,直接将包含赋值结构的字符串解析为单个表达式传入时,函数无法识别该结构为合法的「参数名=模型定义」格式,因此抛出错误。

解决实现

单个模型场景

先拆分字符串的模型名和模型公式部分,再通过rlang的注入语法传入:

require(fable)
require(tsibble)
require(tsibbledata) 
require(rlang)

# 字符串形式的模型定义
model_def <- "avg = MEAN(Trips)"
# 拆分模型名与模型公式
def_parts <- strsplit(model_def, " = ")[[1]]
mod_name <- def_parts[1]
mod_formula <- parse_expr(def_parts[2])

# 动态注入到model函数
tourism %>% 
  model(!!mod_name := !!mod_formula)

多个模型批量传入场景

将所有模型整理为命名列表,批量解析后一次性注入:

# 定义多个模型的字符串列表,键为模型名,值为模型公式
mod_str_list <- list(
  avg = "MEAN(Trips)",
  naive_mod = "NAIVE(Trips)",
  snaive_mod = "SNAIVE(Trips ~ lag('year'))"
)
# 批量解析所有模型公式为表达式
mod_expr_list <- lapply(mod_str_list, parse_expr)

# 批量注入到model函数
tourism %>% 
  model(!!!mod_expr_list)

语法说明

  • !!(双感叹号,bang-bang):将单个表达式注入到当前函数调用中
  • :=:动态赋值运算符,用于实现tidyverse风格函数的参数名动态生成
  • !!!(三感叹号,bang-bang-bang):将命名列表的所有元素展开为独立的命名参数传入函数

内容的提问来源于stack exchange,提问作者Andrea

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 01:54:05