Это довольно сложно:
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