Пожалуйста, рассмотрите следующий пример кода (из документа lm
):
ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14)
trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69)
group <- gl(2,10,20, labels=c("Ctl","Trt"))
weight <- c(ctl, trt)
lm(weight ~ group)
form1 <- weight ~ group
lm(form1)
do.call("lm",list(formula=form1))
Со следующим (сокращенным) выводом:
> lm(weight ~ group)
Call:
lm(formula = weight ~ group)
> lm(form1)
Call:
lm(formula = form1)
> do.call("lm",list(formula=form1))
Call:
lm(formula = weight ~ group)
Как видите,Второй вызов lm
отображает не формулу, а переменную, содержащую формулу.Немного поэкспериментировав, я придумал третье решение, но мне оно показалось немного утомительным.
Поэтому возникает вопрос : есть ли другой способ заставить lm
отображать формулу вместо переменной (т. Е. Без использования метода do.call
, который я использовал выше).
(Причина, по которой я этого хочу, заключается в том, что я работаю над документом Sweave, поэтому я не могу видеть вызовы, только выходные данные, а затем заставляет lm сказать вам, какая формула очень удобна.)
ДАЖЕ ЛУЧШЕЕ РЕШЕНИЕ - Благодаря @ Aaron
lm <- function(...) {
mf <- match.call()
mf[[1]] <- quote(stats::lm)
env <- parent.frame()
mf$formula <- eval(mf$formula, env)
eval(mf, env)
}
РЕШЕНИЕ: Основываясь на ответе Г. Гротендика, я придумал следующую функцию:
lm <- function(...) {
mf <- match.call()
mf[[1]] <- quote(stats::lm)
env <- parent.frame()
fm <- eval(mf, env)
fm$call$formula <- formula(fm)
fm
}