不幸的是,您已经亲身经历了 R 中可以说是最严重的错误。即所谓的非标准评估 (NSE) 错误。
经过一番挖掘代码后,我想我找到了罪魁祸首。让我们一件一件地看:
首先我们来看看traceback()
:
weights <- 0.999^seq(250,1,by=-1)
lapply(subDF, lm, formula=x~., weights=weights)
Error in eval(expr, envir, enclos) :
..2 used in an incorrect context, no ... to look in
> traceback()
8: eval(expr, envir, enclos)
7: eval(extras, data, env)
6: model.frame.default(formula = ..1, data = X[[1L]], weights = ..2,
drop.unused.levels = TRUE)
5: stats::model.frame(formula = ..1, data = X[[1L]], weights = ..2,
drop.unused.levels = TRUE)
4: eval(expr, envir, enclos)
3: eval(mf, parent.frame())
2: FUN(X[[1L]], ...)
1: lapply(subDF, lm, formula = x ~ ., weights = weights)
看起来问题出现在内部model.frame.default
。那么,让我们看一下源代码。我不会发布整个源代码,但如果你输入model.frame.default
在控制台中,您将看到中间的某个位置:
extras <- substitute(list(...))
extranames <- names(extras[-1L])
extras <- eval(extras, data, env)
最后一行是失败的地方。第一行称为 NSE,由以下命令创建substitute
. substitute
将创建所谓的expression
也就是说,让我们说一个稍后在内部评估(即创建)的对象eval
。正如你所看到的eval
, extras
将被评估在data
然后如果没有找到env
。对于公式来说这是可以的,因为它是在数据中评估的并且x~.
会告诉eval
使用中的所有列data
. weights
虽然不在data
。所以,eval
将在以下位置查找它env
。但什么是env
?
显然,env
是一个环境并且是在其中创建的model.frame.default
在行中:
env <- environment(formula$terms)
那么这是什么意思?让我们看另一个例子:
xtest <- function(x) {
new_func <- function(x) {
env <- environment(x)
print(env)
}
new_func(x)
}
> xtest(x~z)
<environment: R_GlobalEnv>
在上面的函数中,我尝试用更少的行复制什么env
将在model.frame.default
。如你看到的,environment(formula)
指向全球环境。
所以,它就在那里env
试图找到..2
即传入的第二个参数...
(i.e. weights
),但由于没有...
在全局环境中,您遇到了错误。希望现在已经清楚了!
最好的解决方案,我会做的是使用 @Heroka 的答案来解决它(或者你可以重写整个model.frame.default
and lm
从头开始不使用 NSE,但我认为第一个更合理:))。