如何使lm在其输出中显示一个作为变量传递给它的公式

ROL*_*OLO 4 r

请考虑以下示例代码(来自lmdoc):

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))
Run Code Online (Sandbox Code Playgroud)

使用以下(缩写)输出:

> 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)
Run Code Online (Sandbox Code Playgroud)

如您所见,第二次调用lm不显示公式,而是包含公式的变量.通过一些实验,我想出了第三个解决方案,但我觉得这个有点单调乏味.

因此问题是:是否有另一种方法来lm显示公式而不是变量(即不使用do.call我上面使用的方法).

(我想要的原因是我正在制作一个Sweave文档,所以我看不到调用,只看到输出,然后让我告诉你它使用的公式非常方便.)


更好的解决方案 - 感谢@Aaron

lm <- function(...) {
  mf <- match.call()
  mf[[1]] <- quote(stats::lm)
  env <- parent.frame()
  mf$formula <- eval(mf$formula, env)
  eval(mf, env)
}
Run Code Online (Sandbox Code Playgroud)

解决方案: 根据G.Grothendieck的回答,我提出了以下功能:

lm <- function(...) {
    mf <- match.call()
    mf[[1]] <- quote(stats::lm)
    env <- parent.frame()
    fm <- eval(mf, env)
    fm$call$formula <- formula(fm)
    fm
}
Run Code Online (Sandbox Code Playgroud)

G. *_*eck 5

把它放在Sweave文件的顶部附近:

<<preliminaries,echo=FALSE,results=hide>>=
lm <- function(fo, ...) { fm <- stats::lm(fo, ...); fm$call <- fo; fm }
@
Run Code Online (Sandbox Code Playgroud)

然后lm在文件的其余部分正常调用.

使用问题中的示例并假设我们已经定义lm如上:

> lm(form1)

Call:
weight ~ group

Coefficients:
(Intercept)     groupTrt  
      5.032       -0.371  
Run Code Online (Sandbox Code Playgroud)