在 R Notebook 中,有一个函式可以在控制台中制作许多绘图并列印摘要统计信息。我想在 HTML 输出上并排获取绘图和控制台输出(即汇总统计信息)。
这是一个非常简单的例子:
---
title: "Example"
output: html_notebook
---
```{r}
mapply(FUN = function(.x) {
plot(.x)
summary(.x)
}, split(iris, iris$Species), SIMPLIFY = FALSE)
```
上述代码的输出如下所示:
如您所见,绘图是一个接一个,控制台输出位于中间的某个位置。
预期的输出如下所示:
我经历了这些 SO 主题但没有成功:
-
低效,但准确
但是,我知道您可能完全需要您所说的结果。我不知道如何在一次呼叫中拆分控制台输出和绘图。我们可以做的是操纵 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) ``` ::: ::::
结果看起来非常接近您想要的输出:
我们通过运行相同的函式(想象它是你提到的那个)来做到这一点,在第一种情况下隐藏绘图和文本输出,但保留代码,然后只将绘图保留在左列中,只有文本输出在右栏。
希望这有帮助。
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
.我还在这里添加了一些文本,但这就是它的样子:
如果您想查看 Javascript 正在做什么,您可以添加
eval = F
和knit
. 这就是它的样子:如果我错过了什么或者您有任何问题,请告诉我。
0 评论