我有一个计算表和模型的函数(以及更多...):
fun <- function(x, y, formula = y ~ x, data = NULL) {
out <- list()
out$tab <- table(x, y)
out$mod <- glm(formula = formula,
family = binomial,
data = data)
out
}
在公式中,我需要使用函数调用中提供的x
和y
(例如x = DF1$x
和y = DF1$y
)以及另一个 Dataframe 中的变量(例如DF2
中的a
和b
)。
fun(x = DF1$x,
y = DF1$y,
formula = y ~ x + a + b,
data = DF2)
# Error in eval(predvars, data, env) : object 'y' not found
如何让glm()
从函数环境中搜索x
和y
?我想这个问题与非标准的求值和/或作用域有关,但我不知道如何修复它。
示例数据:
smp <- function(x = c(TRUE, FALSE),
size = 1e2) {
sample(x = x,
size = size,
replace = TRUE)
}
DF1 <- data.frame(x = smp(),
y = smp())
DF2 <- data.frame(a = smp(x = LETTERS),
b = smp(x = LETTERS))
2条答案
按热度按时间tv6aics11#
为什么不在函数中将
x
和y
添加到data
中呢?r8xiu3jd2#
@DaveArmstrong已经被接受的答案是正确的,这个答案解释了为什么原始版本的代码会出现错误。
@托马斯在评论中引用了这些医生的话
如果在数据中找不到变量,则从环境(公式)中获取变量,通常是从调用glm的环境中获取变量。
“通常”一词在这里很关键。确切的规则是,公式所附加的环境是公式表达式第一次求值的环境,因为
~
实际上是一个函数。它将求值环境附加到公式对象,并且当您传递对象时,求值环境始终与公式对象在一起。如果运行
glm(y ~ x)
,则无论在何处调用该函数,都会计算公式,因此这是“典型”情况。在示例中,您在调用
这意味着全局环境(您进行此调用的位置)与公式关联,并且没有
y
,因此您得到了错误。如果通过调用
如果没有
formula
参数,它也可以工作,因为默认参数是在使用它们的函数的求值框架中求值的,因为fun()
有由参数创建的局部变量x
和y
,这样就可以了。您还问了为什么
data = NULL
可以在@DaveArmstrong的函数中工作,他使用如果你从
data = NULL
开始,第一行把它变成一个包含x
的列表,第二行添加一个y
组件,所以你最终得到一个包含x
和y
的列表,这对于glm()
中的data
来说是很好的。