R标记,在循环中输出测试结果

R标记,在循环中输出测试结果,r,r-markdown,R,R Markdown,我正在寻找一个格式良好的测试结果降价输出,它是在for循环中生成的,并带有标题。比如说 df <- data.frame(x = rnorm(1000), y = rnorm(1000), z = rnorm(1000)) for (v in c("y","z")) { cat("##", v, " (model 0)\n") summary(lm(x~1, df)) cat("##", v, " (model 1)\n")

我正在寻找一个格式良好的测试结果降价输出,它是在for循环中生成的,并带有标题。比如说

df <- data.frame(x = rnorm(1000),
           y = rnorm(1000),
           z = rnorm(1000))

for (v in c("y","z")) {
  cat("##", v, " (model 0)\n")
  summary(lm(x~1, df))

  cat("##", v, " (model 1)\n")
  summary(lm(as.formula(paste0("x~1+",v)), df))
}
y(型号1) z(型号0) 等等

有几个结果讨论了问题的某些部分,例如或建议将
asis
-标记与
cat
-语句结合使用。包括标题

最接近我的请求似乎是两年前的。然而,尽管受到高度赞赏,一些建议还是被弃用,比如
asis_输出
,或者我无法让它们在
formattable
建议(例如使用
lm
-output)等一般条件下工作。我只是想知道——从那时起两年过去了——是否有一种现代的方法可以促进我所寻找的东西。

解决方案类型1 您可以使用一些
lappy
循环来执行
capture.output(cat(.))
方法。将输出发送到文件并使用
rmarkdown::render(.)

这是生成
*.pdf
的R代码

capture.output(cat("---
title: 'Test Results'
author: 'Tom & co.'
date: '11 10 2019'
output: pdf_document
---\n\n```{r setup, include=FALSE}\n
knitr::opts_chunk$set(echo = TRUE)\n
mtcars <- data.frame(mtcars)\n```\n"), file="_RMD/Tom.Rmd")  # here of course your own data

lapply(seq(mtcars), function(i) 
  capture.output(cat("# Model", i, "\n\n```{r chunk", i, ", comment='', echo=FALSE}\n\
                   print(summary(lm(mpg ~ ", names(mtcars)[i] ,", mtcars)))\n```\n"),
                 file="_RMD/Tom.Rmd", append=TRUE))

rmarkdown::render("_RMD/Tom.Rmd")
生产: (注:省略站点3)


此处显示的输出是否为您希望每个模型输出的格式?或者对于每个模型,您还想打印其他内容吗?我希望得到一个简单的print或print.summary语句的格式良好的输出。我不需要在输出的同时打印其他信息。但我确实在循环前后都有R代码,我也希望将其包含在呈现文档中。我找到了另一个解决方案@Tom,我认为这是您真正想要的。谢谢您的回答。是否可以将此解决方案嵌入较长的R脚本中,一方面可以通过rmarkdown渲染,另一方面可以在控制台中逐步运行?@Tom是的,当然,唯一的效果是它生成两个文件(
*.Rmd
*.pdf
),不过,您可以注释掉这些行,以暂时防止它。非常感谢您提供的第二个扩展解决方案,它将很容易融入生产。由于没有人能想出一种更直接的方法来完成我所寻找的任务,这个精心设计的解决方案似乎反映了rmarkdown当前的可能性状态。你赢得了赏金。
Call:
lm(formula = as.formula(paste0("x~1+", v)), data = df)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.8686 -0.6915 -0.0447  0.6921  3.1504 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.05374    0.03297  -1.630    0.103
y           -0.02399    0.03189  -0.752    0.452

Residual standard error: 1.042 on 998 degrees of freedom
Multiple R-squared:  0.0005668, Adjusted R-squared:  -0.0004346 
F-statistic: 0.566 on 1 and 998 DF,  p-value: 0.452
capture.output(cat("---
title: 'Test Results'
author: 'Tom & co.'
date: '11 10 2019'
output: pdf_document
---\n\n```{r setup, include=FALSE}\n
knitr::opts_chunk$set(echo = TRUE)\n
mtcars <- data.frame(mtcars)\n```\n"), file="_RMD/Tom.Rmd")  # here of course your own data

lapply(seq(mtcars), function(i) 
  capture.output(cat("# Model", i, "\n\n```{r chunk", i, ", comment='', echo=FALSE}\n\
                   print(summary(lm(mpg ~ ", names(mtcars)[i] ,", mtcars)))\n```\n"),
                 file="_RMD/Tom.Rmd", append=TRUE))

rmarkdown::render("_RMD/Tom.Rmd")
---
title: "Test results"
author: "Tom & co."
date: "15 10 2019"
output: pdf_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
# Overview

This is an example of an ordinary code block with output that had to be included.

```{r mtcars, fig.width=3, fig.height=3}
head(mtcars)
```
# Test results in detail

The test results follow fully automated in detail.

```{r mtcars2, echo=FALSE, message=FALSE, results="asis"}
invisible(sapply(tail(seq(mtcars), -2), function(i) {
  fo <- reformulate(names(mtcars)[i], response="mpg")
  s <- summary(do.call("lm", list(fo, quote(mtcars))))
  cat("\n## Model", i - 2, "\n")
  sapply(1:19, function(j) 
    cat(paste0("`", ". ", capture.output(s)[j]), "`  \n"))
  cat("  \n")
  }))
```

***Note:*** This is a concluding remark to show that we still can do other stuff afterwards.