这很棘手:
m <- match.call(expand.dots = FALSE)
# ...
m[[1L]] <- as.name("model.frame")
m <- eval(m, parent.frame())
该函数用于match.call
找出它是如何被调用的,修改调用以替换被调用函数model.frame
,并eval
使用它接收到的参数调用它(尽管我替换的部分# ...
删除了几个参数),并model.frame
使用formula
参数。match.call
请参阅、eval
和的文档model.frame
并进行一些实验,例如尝试了解此处发生的情况:
f <- function(formula, data) {
m <- match.call()
m[[1L]] <- as.name('model.frame')
eval(m, parent.frame())
}
f(x ~ y)
Error in eval(expr, envir, enclos) : object 'x' not found
x <- c(1,2,3)
f(x ~ y)
Error in eval(expr, envir, enclos) : object 'y' not found
y <- c(3,4,5)
f(x ~ y)
x y
1 1 3
2 2 4
3 3 5
d <- as.data.frame(matrix(c(1,2,3,4),nrow=2))
names(d) <- c('foo', 'bar')
f(foo ~ bar, d)
foo bar
1 1 3
2 2 4