在 rmarkdown 中包装 table

wrapping wide table in rmarkdown

我有一个非常宽的 table(300 多列),我想通过换行来显示它。在示例中,我将只使用 100 列。

我的想法是重复使用 kable 来显示 table:

的子集
library(kableExtra)
set.seed(1)
data = data.frame(matrix(rnorm(300, 10, 1), ncol = 100))

kable(data[, 1:5], 'latex', booktabs = T) 
kable(data[, 6:10], 'latex', booktabs = T) 
kable(data[, 11:15], 'latex', booktabs = T) 

但这显然很乏味...我知道有缩小选项,但由于我有这么多列,这是不可能的。

我可以在 kable 中修改任何参数来实现它吗?


更新: @jay.sf 的答案似乎运作良好,但在这里没有产生相同的结果。相反,我得到了一些简单的代码——你能再看一眼,让我知道我在哪里可以改进吗?谢谢!

我的 sessionInfo() 是:R version 3.5.1 (2018-07-02)1.19.2.1rmarkdown::pandoc_version()

您可以使用包含列号的矩阵,并将其放入带有 cat 函数的 for 循环中。

---
output: pdf_document
---

```{r, results="asis", echo=FALSE}
library(kableExtra)
set.seed(1)
dat <- data.frame(matrix(rnorm(300, 10, 1), ncol=100))

m <- matrix(1:ncol(dat), 5)

for (i in 1:ncol(m)) {
 cat(kable(dat[, m[, i]], 'latex', booktabs=TRUE), "\newline")
}
```

结果

这个问题其实比我乍一看想的要棘手。我使用了一些 tidyverse 函数,特别是 dplyr::select 来获取列和 purrr::map 来沿着列索引组移动。

我的想法是制作一个列索引向量列表供选择,这样第一个列表项是 1:20,第二个是 21:40,依此类推将数据分成 20 个表格,每个表格 5 列(您使用的数字可以是 ncol(data) 的不同因子)。我低估了这样做的工作量,但从 an old SO post 那里得到了一些想法,即沿着列数表示数字 1 到 20,对其进行排序,然后将其用作分组,然后拆分列。

然后这些向量中的每一个都成为 select 中的列索引。生成的数据帧列表分别传递给 knitr::kablekableExtra::kable_styling。把东西放在那里也会得到 map 的默认打印名称,这并不理想,所以我添加了对 purrr::walk 的调用以整齐地打印它们。

另请注意,以这种方式制作 kable 表意味着将 results="asis" 放入块选项中。

---
title: "knitr chunked"
output: pdf_document
---

```{r include=FALSE}
library(knitr)
library(kableExtra)
library(dplyr)
library(purrr)

set.seed(1)
data = data.frame(matrix(rnorm(300, 10, 1), ncol = 100))
```

```{r results='asis'}
split(1:ncol(data), sort(rep_len(1:20, ncol(data)))) %>%
  map(~select(data, .)) %>%
  map(kable, booktabs = T) %>%
  map(kable_styling) %>%
  walk(print)
```

PDF 输出的顶部: