拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何在RNotebook中并排获取控制台输出和绘图?

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

白鹭 - 2022-02-14 2120 0 0

在 R Notebook 中,有一个函式可以在控制台中制作许多绘图并列印摘要统计信息。我想在 HTML 输出上并排获取绘图和控制台输出(即汇总统计信息)。

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

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


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

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

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

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

预期的输出如下所示:

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

我经历了这些 SO 主题但没有成功:

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

    低效,但准确

    但是,我知道您可能完全需要您所说的结果。我不知道如何在一次呼叫中拆分控制台输出和绘图。我们可以做的是操纵 RMarkdown 输出,使它们看起来来自单个呼叫。请注意,这是低效的,我建议将生成绘图和汇总输出的函式分解为单独的函式,以便像第一个示例一样使用。

    ---
    title: "R Notebook"
    output:
      html_document:
    ---
    
    ```{r, results = F, fig.show = "hide"}
    mapply(FUN = function(.x) {
      plot(.x)
      summary(.x)
    }, split(iris, iris$Species), SIMPLIFY = FALSE)
    ```
    
    :::: {.columns}
    
    ::: {.column width="60%"}
    ```{r, echo = F, results = F}
    mapply(FUN = function(.x) {
      plot(.x)
      summary(.x)
    }, split(iris, iris$Species), SIMPLIFY = FALSE)
    ```
    :::
    
    ::: {.column width="40%"}
    ```{r, echo = F, fig.show = "hide"}
    mapply(FUN = function(.x) {
      plot(.x)
      summary(.x)
    }, split(iris, iris$Species), SIMPLIFY = FALSE)
    ```
    :::
    
    ::::
    

    结果看起来非常接近您想要的输出: 如何在 R Notebook 中并排获取控制台输出和绘图?

    我们通过运行相同的函式(想象它是你提到的那个)来做到这一点,在第一种情况下隐藏绘图和文本输出,但保留代码,然后只将绘图保留在左列中,只有文本输出在右栏。

    希望这有帮助。

    uj5u.com热心网友回复:

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

    这在 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)
    ```
    

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

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

    接下来是您mapply呼叫之前的一些代码和之后的代码。

    <div class="setupCols">
    
    ```{r graphOne}
    mapply(FUN = function(.x) {
      plot(.x)
      summary(.x)
    }, split(iris, iris$Species), SIMPLIFY = FALSE)
    ```
    
    </div>
    

    在此块之后的任何时间点,您都将添加一个样式块。如果您希望它多次应用,请将此块移动到末尾。如果您只希望它应用于块(我命名)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 />')
    
    ```
    

    如果你行内运行这个块,你将不会得到任何输出。但是,当您knit.

    我还在这里添加了一些文本,但这就是它的样子:

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

    如果您想查看 Javascript 正在做什么,您可以添加eval = Fknit. 这就是它的样子:

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

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

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *