【问题标题】:How to export RMarkdown file to HTML document with two columns?如何将 RMarkdown 文件导出为包含两列的 HTML 文档?
【发布时间】:2015-10-23 14:08:03
【问题描述】:

我正在为我工​​作中的一些新 R 用户整理一个 R Markdown HTML 页面,向他们介绍并引导他们完成一些简单的演示。

在炫耀headtail 之类的东西时,它最终看起来又乱又长,因为它会一个接一个地打印出每个输出。只要将我的 .Rmd 的其他部分分成两列,我就希望它们。

在我的研究中,我遇到了这个question。有一些关于我不理解的 HTML 代码的变通方法的讨论。

我确实尝试过包括:

<div class="columns-2">   
</div>

来自rmarkdown官方文档,但没有任何作用。

当我准备放弃时,@Molx 对 Stack Overflow 问题发表了评论,说您可以用 *** 分隔列,但没有给出任何进一步的解释。我尝试了几种方法:我将*** 包含在我的R 代码块的中间,我将我的R 代码块分开并将*** 放在两者之间。当我做后者时,*** 只是变成了一条水平线,对列没有任何作用。

如果可能,我希望避免使用表格和 CSS。

【问题讨论】:

  • 其中任何一个都可以工作,所以很高兴看到你做了什么,看看他们为什么不工作
  • htmlwidgets 中的 flexdashboard 使这项任务变得微不足道! ps(很抱歉添加到包的丛林中,但它帮助我在 15 分钟内生成了相当不错的列)

标签: html r r-markdown


【解决方案1】:

rmarkdown 文件:

#### Put in your css file or directly in rmarkdown

<style>
  .col2 {
    columns: 2 200px;         /* number of columns and width in pixels*/
    -webkit-columns: 2 200px; /* chrome, safari */
    -moz-columns: 2 200px;    /* firefox */
  }
  .col3 {
    columns: 3 100px;
    -webkit-columns: 3 100px;
    -moz-columns: 3 100px;
  }
</style>

#### This section will have three columns

<div class="col3">
**1** one  
**2** two  
**3** three  
**4** four  
**5** five  
**6** six  
**7** seven  
**8** eight  
**9** nine  
</div>

#### This section will have two columns

<div class="col2">
```{r}
head(mtcars)
tail(mtcars)
```
</div>

给我这个


编辑

为了更精确地使用列元素,您可以为每组元素使用一个 div:

Rmd 文件

<style>
.column-left{
  float: left;
  width: 33%;
  text-align: left;
}
.column-center{
  display: inline-block;
  width: 33%;
  text-align: center;
}
.column-right{
  float: right;
  width: 33%;
  text-align: right;
}
</style>

#### This section will have three columns

<div class="column-left">
**1** one  
**2** two  
</div>
<div class="column-center">
**3** three  
**4** four  
**5** five  
**6** six  
</div>
<div class="column-right">
**7** seven  
**8** eight  
**9** nine  
</div>

给我

【讨论】:

  • 这个答案非常有帮助。我现在意识到我的心态完全不对了。我完全忘记了 CSS 是如何工作的。我假设 "columns-2" 类提到的 rmarkdown 文档是一个已建立的类,我实际上不必编写任何 CSS。你的解决方案很棒!我仍然很好奇是否有人还有关于*** 解决方案的更多信息。
  • 如何选择进入下一栏?有没有办法指定例如 1 和 2 在第一列,然后 3,4,5,6 在第二列?
  • @RockScience &lt;div style="float: left; width: 33%;"&gt; **1** one **2** two &lt;/div&gt; &lt;div style="float: left; width: 33%;"&gt; **3** three **4** four **5** five **6** six &lt;/div&gt; &lt;div style="float: right; width: 33%;"&gt; **7** seven **8** eight **9** nine &lt;/div&gt; 用换行符代替空格
  • @RockScience 为您的问题更新了更好的解决方案
  • @rawr 非常有帮助的答案!我想知道如何将标题部分放在 div 中?我已将标题部分放入您的 div,但我尝试放入文档中的下一个标题部分从右侧开始,而它应该在左侧,就像普通部分一样
【解决方案2】:

用于创建多列的 CSS 解决方案不允许控制分栏发生的位置。似乎会自动插入分栏符以在各列之间平均分配内容,这并不总是您想要的。
markdown 和 rmarkdown 中的“***”符号插入水平换行符,而不是新列。

除了用于幻灯片演示的 .Rmd 格式外,Rstudio 还提供了 .Rpres 幻灯片演示格式 (Rpresentations)。 Rpresentations 使用了一种略有不同的 markdown,其中“***”符号插入了一个新列。

以下是 RStudio 介绍 Rpresentations 的链接:
Two Column Layouts
Authoring R Presentations

以下是与您类似的 StackOverflow 问题的链接:
Two Column Layouts in RStudio
Two Column Layouts in markdown

Rpresentation 格式的最大缺点是它不支持用于交互式可视化的嵌入式闪亮应用程序。但 Rpresentation 确实支持交互式 webgl 图。下面是一个简单的例子。您可以将其保存到 .Rpres 文件中,在 RStudio 中打开它,然后将其编译为 HTML 幻灯片演示文稿。请注意最后一张幻灯片中的交互式 webgl 图,您可以使用鼠标进行操作。

Simple R Presentation
========================================================
title: "Simple R Presentation"
author: John Doe
date: `r format(Sys.time(), "%m/%d/%Y")`
width: 1900
height: 1000
```{r setup, include=FALSE}
# This is an R setup chunk, containing default options applied to all other chunks
library(knitr)
# This sets the chunk default options
opts_chunk$set(cache=TRUE, collapse=TRUE, error=FALSE, prompt=TRUE)
# This sets the chunk display theme
thm <- knit_theme$get("acid")
knit_theme$set(thm)
# This sets some display options
options(digits=3)
options(width=80)
```


My First Slide
========================================================
Hello World!  
Creating Rpresentations isn't difficult at all!  

<img src="https://community.filemaker.com/servlet/JiveServlet/showImage/2-180549-7694/staples-easy-button.png" width="500" height="500" />


***

The Cauchy-Schwarz Inequality:  

$$
\left( \sum_{k=1}^n a_k b_k \right)^2 
\leq 
\left( \sum_{k=1}^n a_k^2 \right) 
\left( \sum_{k=1}^n b_k^2 \right) 
$$



Slide With R Code Chunk and Output in Two Columns
========================================================

First column contains simple R code that returns the summary of the cars data frame:  
```{r, summ_cars, eval=FALSE, echo=TRUE, results="hold", size="tiny"}
summary(cars)
```
***
Second column contains the output of the code in the first column:  
```{r, summ_cars, eval=TRUE, echo=FALSE, size="tiny"}
```



Slide With Plot
========================================================

First column with R code:  
```{r, plot_cars, eval=TRUE, echo=(-(1:1)), fig.show="hide"}
par(cex.lab=1.5, cex.axis=1.5, cex.main=1.5, cex.sub=1.5)
plot(cars)
```

***

Second column with plot:  
```{r, plot_cars, eval=TRUE, echo=FALSE, fig.width=10, fig.height=8}
```



Slide with Interactive 3d Surface Plot
========================================================

First column with R code:  
```{r, rgl_surf3d, eval=FALSE, echo=TRUE, webgl=TRUE, fig.show="hide"}
library(rgl)  # load rgl
knit_hooks$set(webgl=hook_webgl)
# define function of two variables
foo <- function(x, y) y*sin(x)
# draw 3d surface plot of function
persp3d(x=foo, xlim=c(-5, 5), ylim=c(-5, 5), col="green", axes=FALSE)
```

***

Second column with plot:  
```{r, rgl_surf3d, eval=TRUE, echo=FALSE, webgl=TRUE, fig.width=10, fig.height=8}
```

【讨论】:

    【解决方案3】:

    来自 rawr 的自定义 css 解决方案很好,但如果您想要更多自定义并完全避免显式 css,还有另一种方法。由于 markdown 使用 Bootstrap-layout,我们可以使用 Bootstrap 网格布局进行详细样式设置:

    唯一的缺点是多了几个 html-tags

    例子:

    ---
    title: "test"
    author: "Testperson"
    output:
      html_document
    ---
    
    ```{r setup, include=FALSE}
    knitr::opts_chunk$set(echo = TRUE)
    ```
    
    ## R Markdown
    
    This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see <http://rmarkdown.rstudio.com>.
    
    When you click the **Knit** button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:
    
    <div class = "row">
    <div class = "col-md-6">
    ```{r cars,  warning = FALSE, echo = FALSE, dev=c('svg')}
    plot(pressure)
    ```
    </div>
    <div class = "col-md-6">
    ```{r pressure, warning = FALSE, echo=FALSE, dev=c('svg')}
    plot(pressure)
    ```
    </div>
    </div>
    

    【讨论】:

    • @JanStanstrup 不,这是正确的,因为它是 html 和引导程序,对于 pdf 还有其他方法
    • 这个对我有用。选择正确的答案有效,但是当我在谷歌浏览器等浏览器中打开 html 文档时,输出出现在一个列布局中。谢谢!!
    • @ErrantBard pdf 的其他方式是什么?
    • @Laura 检查文档!这个问题可能会有所帮助(它涉及 pdf-docs 中的编号):stackoverflow.com/questions/42852069/…
    • @Laura 我在 LaTeX 中尝试这个的方法(这是来自 Rmarkdown 的 PDF 文档的先决条件)是使用 paracol 包。在paracol 中,\switchcolumn 命令会派上用场。我建议您每次要开始新行时使用星号 *
    【解决方案4】:

    如果您要导出为 pdf,您可以在带有包含的标题中执行此操作。

    在不使用 css 文件的情况下,我使用以下内容创建了一个两列环境。

    第一个:我创建了文件header.texheader.tex 包括以下语句:

    \usepackage{multicol}
    \newcommand{\btwocol}{\begin{multicols}{2}}
    \newcommand{\etwocol}{\end{multicols}}
    

    第二个:我将以下命令放入我的文档标题中

    ---
    title: "My title"
    author: "My name"
    date: "Today"
    output:
        beamer_presentation:
            highlight: haddock
        includes:
            in_header: header.tex
            keep_tex: yes
    ---
    

    这是正文的示例和带有两列的输出图片。

    ***********
    \btwocol
    ```{r, results="asis"}
    print("test")
    ```
    
    Here is some text that also is in two column environment.
    \etwocol
    
    Now only one column
    

    这是幻灯片的样子:

    【讨论】:

    • 您能说明如何将此输出设为 pdf 吗?我无法让它工作。
    • 这就是您在header.tex 中所需要的吗?还是需要额外的线路?
    【解决方案5】:

    更新(2020 年 5 月)

    Pandoc 现在支持fenced_div 方法来指定环境。这也是 R Markdown Cookbook recommends 用于多列环境的方法,对序言文件进行了一些特殊调整。

    我已经更新了我的原始链接示例(如下)以反映这一最佳实践......但我还打包了一个 R Markdown template,它将必要的序言文件捆绑在一起。使用这种围栏 div 方法的 MWE 可能如下所示:

    ---
    title: "Two column test"
    output:
      html_document:
        css: preamble.css
      pdf_document:
        includes:
          in_header: preamble.tex
    ---
    
    This is regular text spanning the whole page. But here comes a two-column section.
    
    :::::: {.columns}
    ::: {.column width="48%" data-latex="{0.48\textwidth}"}
    This text is in the left column.
    :::
    ::: {.column width="4%" data-latex="{0.04\textwidth}"}
    \ 
    <!-- an empty Div (with a white space), serving as
    a column separator -->
    :::
    :::::: {.column width="48%" data-latex="{0.48\textwidth}"}
    This text is in the right column.
    :::
    ::::::
    \newline
    
    And back to a regular single-column environment.
    

    原答案

    对此线程的后期贡献,但只是指出您可以结合@rawr 和@Alison 的答案来为 HTML 和 PDF 启用多列部分。 R Markdown/knitr 足够聪明,可以根据所需的输出格式仅解析相关命令。我经常将同一个文档编织成多种格式,所以这非常方便。这是一个完全开发的example

    【讨论】:

    • @GregorThomas 完成。
    猜你喜欢
    • 2023-03-25
    • 2021-08-20
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多