Как можно использовать параметр функции, не упоминая его в теле функции? - PullRequest
7 голосов
/ 22 апреля 2009

Я пытался узнать больше о R (и о написании расширений C) и подумал, что это может помочь прочитать исходные тексты некоторых известных пакетов. Я решил начать с rpart, которая определяется как:

rpart <- function(formula, data, weights, subset,
       na.action=na.rpart, method, model=FALSE, x=FALSE, y=TRUE,
       parms, control, cost, ...)

Я сделал быстрый поиск по источнику, и я не вижу ни одной формулы, упомянутой в теле функции, но я знаю, что каким-то образом rpart использует этот параметр. Как получилось, что rpart использует формулу без имени в теле функции?

1 Ответ

9 голосов
/ 22 апреля 2009

Это довольно сложно:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...