【问题标题】:R Markdown, output test results in loopR Markdown,循环输出测试结果
【发布时间】:2019-10-08 08:51:57
【问题描述】:

我正在寻找格式良好的 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")
  summary(lm(as.formula(paste0("x~1+",v)), df))
}

而输出应该是

y(型号 0)

Call:
lm(formula = x ~ 1, data = df)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.8663 -0.6969 -0.0465  0.6998  3.1648 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.05267    0.03293    -1.6     0.11

Residual standard error: 1.041 on 999 degrees of freedom

y(模型 1)

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

z(型号 0)

等等……

有几个结果讨论了问题的某些部分,例如herehere,建议将asis-tag 与cat-statement 结合使用。 This one 包括标题。

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

【问题讨论】:

  • 您在此处显示的输出是您希望每个模型输出的格式吗?或者您还想为每个模型打印其他内容吗?
  • 我希望统计测试对象的简单 print 或 print.summary 语句的输出格式良好。我不需要与此输出一起打印的其他信息。但我确实在循环之前和之下有 R 代码,我也希望将其包含在呈现的文档中。
  • 我找到了另一个解决方案@Tom,我想这就是你真正想要的。

标签: r r-markdown


【解决方案1】:

解决方案类型 1

您可以使用 lapply-looping 执行 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")

生产:

解决方案类型 2

当我们想在 rmarkdown 本身中自动输出多个模型摘要时,我们可以在 1. 选择块选项 results='asis' 之间进行选择,这将产生代码输出,但例如# Model 1 标题,或 2. 选择不选择它,这会产生 Model 1 但会破坏代码格式。解决方案是使用该选项并将其与我们可以paste() 与模型的sapply() 内的另一个sapply()-loop 一起使用的内联代码。

在主要的sapply 中,我们应用@G.Grothendieck 的 古老的solution 来很好地使用Call: 替换输出的Call:do.call("lm", list(.))。我们需要在它周围包裹一个invisible(.) 以避免产生不必要的sapply() 输出[[1]] [[2]]... 的空列表。

我在cat() 中加入了". ",因为在摘要输出的第 6 行和第 10 行中,` this` 之类的前导空白将呈现给 this

这是生成*pdf 的rmarkdown 脚本,也可以逐行执行:

---
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.

生产:

注意: Site 3 省略)

【讨论】:

  • 感谢您的回答。是否可以将此解决方案嵌入到更长的 R 脚本中,一方面可以通过 rmarkdown 呈现,另一方面可以在控制台中逐步运行?
  • @Tom 是的,当然,唯一的影响是它会生成两个文件(*.Rmd*.pdf),不过您可以注释掉这些行以暂时阻止它。
  • 非常感谢您提供的第二个扩展解决方案,它将很容易融入到生产中。由于没有人想出一种更直接的方法来做我正在寻找的事情,这个精心设计的解决方案似乎反映了 rmarkdown 的当前可能性状态。你已经赢得了赏金。
猜你喜欢
  • 1970-01-01
  • 2020-01-30
  • 2016-01-21
  • 2020-09-28
  • 2012-09-23
  • 2014-01-09
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多