当在指定子集的同时为公式传递字符串参数时,为什么R`glm`函数不能正常工作?

当在指定子集的同时为公式传递字符串参数时,为什么R`glm`函数不能正常工作?,r,glm,R,Glm,对glm的前两个调用正常工作,而最后一个调用抛出错误 为什么会出现这种情况?如果我想为公式使用字符串并指定子集,是否有任何已知的解决方法?用例是我希望在自己的函数中以字符串形式传递公式,而不必包装和展开原始公式 library(ISLR) foo =function() { train=sample(10000, 5000, replace=F) # both work glm.fit = glm('default~income + balance', data=Default, family=

glm
的前两个调用正常工作,而最后一个调用抛出错误

为什么会出现这种情况?如果我想为公式使用字符串并指定子集,是否有任何已知的解决方法?用例是我希望在自己的函数中以字符串形式传递公式,而不必包装和展开原始公式

library(ISLR)
foo =function() {
train=sample(10000, 5000, replace=F)
# both work
glm.fit = glm('default~income + balance', data=Default, family=binomial)
glm.fit = glm(default~income + balance, data=Default, family=binomial, subset=train)

# Does not work.
#glm.fit = glm('default~income + balance', data=Default, family=binomial, subset=train)
}
foo()
错误如下所示

Error in eval(expr, envir, enclos) : object 'train' not found              
Calls: foo ... eval -> model.frame -> model.frame.default -> eval -> eval  
Execution halted                                                           

更新:我将示例放在函数中,因为它似乎只是函数中的一个问题。

我无法复制此示例
glm('default~income+balance',data=default,family=binomial,subset=train)
对我有效。这似乎只在函数内部复制。我最初的测试代码有这个函数,但我认为这个函数与它无关。我将更新我的示例。我猜它与讨论的问题有关。看来我可以通过传递一个闭包来解决这个问题,该闭包使用适当的参数调用
glm
函数。@mnel--谢谢!我很确定这就是问题的根源。调用
as.formula()
的环境将是调用
model.frame.default()
的求值框架,它的父环境将是
package:stats
(定义
model.frame.default
的环境)。然后进入基本环境、全局环境,并沿着搜索路径继续。要点是,由于词法范围和
glm()
使用的非标准评估相结合,传递给
data
的data.frame将完全丢失。