R语言函数内调用allEffects时data123无法识别如何解决?
问题成因
该问题是R环境作用域和effects包的内部查找逻辑导致,和你使用的Windows 10系统、R 4.0.0版本无关:
- 在
foo函数内部调用lm生成fit2时,fit2$call$data存储的是data123这个变量名符号,而非实际的数据集对象。 effects包的allEffects函数默认会在全局环境中查找fit2$call里指定的数据集对象,而data123是foo函数内的局部变量,仅存在于foo的执行环境中,全局环境不存在该对象,因此触发找不到对象的报错。
修复方案
以下三种方案任选其一即可:
- 方案1:调用
allEffects时显式传入data参数,直接把局部数据集传给函数,不需要它自行查找
修复后代码示例:foo <- function(fit,...) { data123 <- eval(fit$call$data) fit2 <- lm(fit$call$formula, data = data123) # 显式传入data参数 allEffects(fit2, data = data123, ...) } - 方案2:修改
fit2的调用记录,把data对应的变量名替换为实际数据集,避免allEffects去环境中查找
修复后代码示例:foo <- function(fit,...) { data123 <- eval(fit$call$data) fit2 <- lm(fit$call$formula, data = data123) # 替换call中的data为实际数据集 fit2$call$data <- data123 allEffects(fit2, ...) } - 方案3:指定
allEffects的查找环境为当前函数的执行环境,让它可以找到局部变量data123
修复后代码示例:foo <- function(fit,...) { data123 <- eval(fit$call$data) fit2 <- lm(fit$call$formula, data = data123) # 指定查找环境为当前函数环境 allEffects(fit2, envir = environment(), ...) }
内容的提问来源于stack exchange,提问作者Simon Harmel
相关产品推荐
相关产品推荐

