それはかなりトリッキーです:
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