R语言recipes包step_interact()函数公式传入问题求助
解决recipes包step_interact()变量传参报错问题
问题原因
你遇到的问题大概率是公式对象的定义方式或环境不匹配导致的:
- 如果直接把公式写成字符串赋值给变量,
step_interact()无法识别(它需要的是公式对象而非字符串) - 即使通过
as.formula()转换,若未指定正确的环境,recipe在解析时可能无法找到变量上下文
解决方案
以下三种方案均可解决问题,根据你的场景选择:
方案1:直接定义公式对象
直接将公式以对象形式赋值给变量,而非字符串:
library(recipes) # 直接创建公式对象 int <- ~ bill_depth_mm:bill_length_mm # 传入step_interact rec <- recipe(你的响应变量 ~ ., data = 你的数据集) %>% step_interact(terms = int) %>% prep()
方案2:字符串转公式时指定环境
如果必须从字符串生成公式,转换时指定当前环境:
library(recipes) # 字符串形式的公式 int_str <- "~ bill_depth_mm:bill_length_mm" # 转换为公式并指定当前环境 int <- as.formula(int_str, env = environment()) # 传入step_interact rec <- recipe(你的响应变量 ~ ., data = 你的数据集) %>% step_interact(terms = int) %>% prep()
方案3:使用rlang的引用注入(动态场景适用)
如果需要动态生成公式,用rlang的引用与注入机制:
library(recipes) library(rlang) # 创建quosure类型的公式 int <- quo(~ bill_depth_mm:bill_length_mm) # 用!!注入到step_interact中 rec <- recipe(你的响应变量 ~ ., data = 你的数据集) %>% step_interact(terms = !!int) %>% prep()
验证示例
用iris数据集测试上述方案,均可正常运行:
data(iris) # 测试方案1 int1 <- ~ Sepal.Length:Sepal.Width rec1 <- recipe(Species ~ ., data = iris) %>% step_interact(terms = int1) %>% prep() # 测试方案2 int_str2 <- "~ Sepal.Length:Sepal.Width" int2 <- as.formula(int_str2, env = environment()) rec2 <- recipe(Species ~ ., data = iris) %>% step_interact(terms = int2) %>% prep() # 测试方案3 int3 <- quo(~ Sepal.Length:Sepal.Width) rec3 <- recipe(Species ~ ., data = iris) %>% step_interact(terms = !!int3) %>% prep()
内容的提问来源于stack exchange,提问作者off
相关产品推荐
相关产品推荐

