【发布时间】:2016-05-19 14:48:56
【问题描述】:
我正在处理一个包含对lm() 的调用的自定义函数,但由于某种原因该函数失败了。我无法理解它失败的原因。
考虑这个简单的例子:
myfun <- function(form., data., subs., ...){
lm(form., data., subs., ...)
}
这将导致错误:
myfun(mpg ~ cyl + hp, mtcars, TRUE)
## Error in eval(expr, envir, enclos) : object 'subs.' not found
但是直接使用lm() 就可以了:
lm(mpg ~ cyl + hp, mtcars, TRUE)
##
## Call:
## lm(formula = mpg ~ cyl + hp, data = mtcars, subset = TRUE)
##
## Coefficients:
## (Intercept) cyl hp
## 36.90833 -2.26469 -0.01912
我尝试了调试,但仍然无法找到问题的根源。为什么自定义函数会失败?显然subs. 已提供给函数...
编辑:
虽然下面建议的大多数解决方案都有助于这种简单的情况,但如果我添加一个简单的扭曲,该功能仍然会失败。例如expand.model.frame() 依赖于公式的环境,但如果我使用正常的评估解决方案会失败:
myfun <- function(form., data., subs., ...){
fit <- lm(form., data.[ subs., ], ...)
expand.model.frame(fit, ~ drat)
}
myfun(mpg ~ cyl + hp, mtcars, TRUE)
## Error in eval(expr, envir, enclos) : object 'data.' not found
这显然与原始问题有关,但我不知道如何。模型公式的环境是否被破坏了?
【问题讨论】:
-
一个简短的答案可能是不要单独列出
subset参数。只需通过...以命名方式传递所有内容。 -
@joran 是的,这可以做到,但我正在处理我的自定义乐趣中的许多不同功能,并且通过
...将其全部传递可能不是一个可靠的解决方案。我最终可能会将一些参数传递给错误的函数。我仍然不明白为什么问题中的功能会失败...... -
这很复杂,我一大早(对我来说)正在努力解释清楚。基本上它归结为在
lm中进行的大量特殊评估。 -
@joran 谁说过 R 不是古怪的……那么围绕这个“特殊评估”的犹太方式是什么?使用
...或执行match.call(),然后匹配所需的参数,后跟do.call()(基本上是在lm中完成的工作流程)? -
Roland 的第一个贡献是:“干净的解决方案是使用标准评估”。区别只是程度的问题。我不确定所有这些人可以用多少不同的方式来解释公式附加了环境,以及创建公式的位置会影响查找内容的位置,因此在顶层创建的公式将附加到全局环境。并且全球环境不知道
myfun的参数。