R自定义函数内求值表达式构建线性模型报错解决方法
问题根因
- 原代码报错的核心是
eval(parse(text=y))执行时没有指定正确的求值上下文,默认在函数内部环境搜索lifespan对象,而该变量是传入数据集的列,不在函数内部搜索路径中,因此触发找不到对象的报错。 - 后续修改的
parse(text=data$y)写法存在逻辑错误:$操作符会精确匹配列名为y的字段,而传入的数据集不存在该列,因此返回空值,parse处理空输入时会触发R的交互式输入模式,弹出?提示符等待用户补充输入,输入不完整就会导致R会话崩溃。
正确实现代码
reformulate原生支持直接传入字符串格式的响应变量和预测项,不需要手动做解析求值操作,只要绑定正确的公式环境即可:
library(faraway) formula_levels <- function(x, y, data) { # 直接传入字符串构造公式,无需额外解析响应变量 formula_eval <- reformulate(termlabels = x, response = y) # 绑定公式环境为当前调用环境,保证建模时能正确从数据集取数 environment(formula_eval) <- parent.frame() lm_mod <- lm(formula_eval, data = data) return(lm_mod) } # 测试调用 formula_levels('body+sleep', 'log(lifespan)', mammalsleep)
扩展说明
该实现同时兼容更复杂的表达式传入,比如预测项带变换的场景formula_levels('log(body)+sleep', 'log(lifespan)', mammalsleep)也可以正常运行,不需要额外修改解析逻辑。
内容的提问来源于stack exchange,提问作者Dollar Tune-bill
相关产品推荐
相关产品推荐

