如何给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
相关产品推荐
相关产品推荐

