如何在 R Notebook 中获取控制台输出并并排绘图?

Pau*_*aul 7 layout plot r r-markdown rnotebook

在 R Notebook 中,有一个函数可以在控制台中绘制许多图并打印摘要统计数据。我想在 HTML 输出上并排获得绘图和控制台输出(即摘要统计数据)。

这是一个非常简单的例子:

---
title: "Example"
output: html_notebook
---


```{r}
mapply(FUN = function(.x) {
  plot(.x)
  summary(.x)
}, split(iris, iris$Species), SIMPLIFY = FALSE)
```
Run Code Online (Sandbox Code Playgroud)

上述代码的输出如下所示:

在此输入图像描述

正如您所看到的,绘图是一个接一个的,控制台输出位于中间的某个位置。

预期输出如下:

在此输入图像描述

我浏览了这些SO主题但没有成功:

请注意,我真的想获取控制台输出,如果可能的话,我想避免使用许多转换来获取 grob 或图片,因为有时,我的实际输出的相关方法不存在。不使用 R Notebook 而是使用 RMarkdown 也可以。

Kat*_*Kat 5

它并不完美。例如,我没有添加屏幕尺寸的处理程序。不过,我可以。不过,你必须让我知道你在寻找什么。

这在 R Markdown 中使用了 Javascript。其引擎是内置的。但是,我添加了代码供您检查(如果您选择的话):names(knitr::knit_engines$get())

另外,在setup块中,我添加了options(width = 75). 这将影响所有块输出。您可以更改它以使其成为特定于块的选项。但是,默认值为 80,因此您可能不会注意到差异。我这样做是因为对于三组中的两组,Species包裹到下一行。然而,对于 来说versicolor,情况就不同了。这是统一执行的一部分。

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)

# confirm engine for 'js' (it was #37 for me)
names(knitr::knit_engines$get())

# set the output width for chunks' render
# this is to keep the summaries even (versicolor was doing its own thing)
options(width = 75)
library(tidyverse)
```
Run Code Online (Sandbox Code Playgroud)

样式不是一个块。这在设置和下一个块之间进行。

<style>
.setupCols {
  display:flex;
  flex-direction:row;
  width: 100%;
}
.setupCols p{
  display:flex;
  flex-direction: column;
  width: 45%;
}

.setupCols pre {
  display:flex;
  flex-direction: column;
  width: 55%
}
.setupCols pre code {
  font-size: 85%;
}
</style>
Run Code Online (Sandbox Code Playgroud)

接下来是调用前的一些代码mapply和调用后的代码。

<div class="setupCols">

```{r graphOne}
mapply(FUN = function(.x) {
  plot(.x)
  summary(.x)
}, split(iris, iris$Species), SIMPLIFY = FALSE)
```

</div>
Run Code Online (Sandbox Code Playgroud)

在该块之后的任何时间点,您都将添加一个样式块。如果您希望它多次应用,请将此块移至末尾。如果您只想将其应用于块(我命名)graphOne,则将其设为下一个块。

```{r styler,results='asis',engine='js'}

// search for class and tags
elem = document.querySelector('div.setupCols > pre > code');
// remove hashtags
elem.innerHTML = elem.innerHTML.replace(/#{2}/g, '');
// add newlines between summaries
elem.innerHTML = elem.innerHTML.replace(/\s{9}\n/g, '<br /><br />')

```
Run Code Online (Sandbox Code Playgroud)

如果您内联运行此块,您将不会得到任何输出。但是,当您执行knit.

我还在这里添加了一些文字,但它看起来是这样的:

在此输入图像描述

如果您想查看 Javascript 在做什么,您可以添加eval = Fknit。它将如下所示:

在此输入图像描述

如果我错过了什么或者您有任何疑问,请告诉我。