【问题标题】:Is there a way to fold tables side by side in RMarkdown or quarto?有没有办法在 RMarkdown 或 quarto 中并排折叠表格?
【发布时间】:2022-11-12 09:57:31
【问题描述】:

有没有办法在 RMarkdown 或 quarto 中包装单个表格?

我经常处理时间序列数据,需要列出它们。我使用 HTML 作为输出格式。

例如,假设从 2022 年 1 月 1 日到 2022 年 7 月 1 日,我每天进行一次温度测量。 该数据有 182 行观测值。我想用围绕它的适当长度的数据来显示它。

我使用{kableExtra} 作为示例代码以markdown 输出Stackoverflow,但我并不特别关注表格输出的包。

data <- tibble::tibble(
  date = seq.Date(from = as.Date("2022-01-01"), to = as.Date("2022-07-01"), by = "day"),
  temp = rnorm(length(date), mean = 35.5, sd = 0.3)
)

# Here is the top of the table
head(data) |> 
  kableExtra::kbl(format = "markdown", digits = 1)
date temp
2022-01-01 35.2
2022-01-02 35.5
2022-01-03 35.6
2022-01-04 36.3
2022-01-05 35.5
2022-01-06 35.5

创建于 2022-11-06,reprex v2.0.2

【问题讨论】:

  • 只显示您想要显示的表格的一部分,即将其截断为较短的表格怎么样?你已经使用了head()。这没有帮助吗?您可以使用head(data, 15)(注意:head() 默认为 n=6)或data[1:15,] |&gt; kable() 显示前 15 行。还有其他方法可以根据您的喜好过滤 tibble 的特定行。
  • 是的,我的目标不是显示所有数据。然而,有时需要包裹一张桌子,即使是部分包裹。例如,如果我想显示 10 行数据,每行包含 5 行数据怎么办?
  • 下面有一个广泛的答案(对 Sing Song 表示敬意 - 真的很详细!)这应该回答“如何输出”。坚持的一点是“每行包含 5 行”的意思。如果我说得对,那么您是在谈论将较长的表分解为较小的(子)表。执行此操作的“手动”方式是使用您喜欢的子表创建多个对象并一一打印它们,例如data[1:5,] |&gt; kable(); data[6:10,] |&gt; kable()

标签: r r-markdown quarto


【解决方案1】:

在编辑了这个答案一个小时后,我意识到我的答案有点偏离了方向。我的答案已经转移到如何进行任何类型的输出折叠的问题上。

如果你想做 10 行数据,每行 5 行,我假设你的意思是分页?然后我不知道该怎么做。

如果你想要一个部分表,我知道dyplyr::tibble() 会打印出前 10 行数据并缩写其余的数据。使用dyplyr::tibble(knitr::kable(your_table)),它将打印表格,但以纯文本格式(如降价表格)。

我最近切换到了 Quarto,他们似乎也没有任何这样的分页功能。下面我提供了 3 种我知道适用于 Rmd 并且可能也适用于 Quarto 的方法。

附言

  • 前 2 个方法确实不是折叠桌子。但它会总是折叠纯文本输出。
方法 1:使用 CSS 样式的可滚动输出

参考R Markdown Cookbook-7.4 Scrollable Code Blocks,使用CSS样式,

```{css, echo=FALSE}
前{
  最大高度:300px;
  溢出-y:自动;
}

前[类] {
  最大高度:100px;
}

.scroll-100 {
  最大高度:100px;
  溢出-y:自动;
  背景颜色:继承;
}
```
```{r, class.Output="scroll-100"}
1:1000
```

输出

方法 2:使用 Pandoc 的 Fenced 代码块的可滚动输出

参考R Markdown Cookbook-12.3 Scrollable Text Output

```{r}
options(width = 60)
local({
  hook_output <- knitr::knit_hooks$get('output')
  knitr::knit_hooks$set(output = function(x, options) {
    if (!is.null(options$max.height)) options$attr.output <- c(
      options$attr.output,
      sprintf('style="max-height: %s;"', options$max.height)
    )
    hook_output(x, options)
  })
})
```
```{r, max.height='100px'}
1:1000
```

输出

方法 3:使用 HTML Button 和 Div Tag 折叠所有内容

由于您使用的是 HTML,我想一种选择是尝试使用 HTML。下面的代码将为您提供一个引导功能按钮,您可以在其中隐藏任何内容。您也可以将此方法与方法 1 或 2 结合使用。

<button class="btn btn-primary" data-toggle="collapse" data-target="#BlockName"> Show/Hide Tables</button>  
<div id="UniqueBlockName" class="collapse">  

    ```{r}
      you code to print tables
    ```

</div>

输出

笔记: 这必须包含你的源代码(你可以使用echo=FLASE),如果你的桌子很大或者里面有传单地图之类的东西,点击查看它可能会导致滞后。在这种情况下,我建议改用 head(your_table) 函数。

附言: 如果您对kableExtra 的表格输出不满意,不妨试试knitr::kable(you code to print table)rmarkdown::paged_table(...)pander::pander(...)。我特别喜欢用于 PDF 输出的 pander 表,它将支持 Latex 的表居中用于列/行名称。但根据 HTML 主题输出,pander() 并不总是最好的。

【讨论】:

    猜你喜欢
    • 2022-12-11
    • 2014-01-29
    • 2019-08-29
    • 2017-09-01
    • 2021-02-20
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多