RMarkdown kable 垂直对齐单元格

azd*_*sci 6 latex r-markdown kableextra kable

我正在使用 RMarkdown 编写报告,并使用 kable 和 kableExtra 来格式化和打印表格。这是我想要的表格看起来像(在 Word 中制作的):

中间单元格对齐

我正在努力对垂直居中进行排序("Number of Incident Occurences"顶部和底部之间的空间,以便文本在行的中间对齐,在列的左侧。

请注意,我正在创建 PDF 报告而不是 html。

这是一个最小的例子:

df <- data.frame(a = letters[1:5], b = 1:5)
names(df) <- c("A very very very very very very very very very very very very very very very very very very long title",
               "A short title")

df %>% kable(format = 'latex', linesep = "", align = 'c', escape = F) %>% kable_styling(full_width = T)
Run Code Online (Sandbox Code Playgroud)

这是输出的样子:

在此处输入图片说明

垂直对齐似乎正在推向顶部。我遇到了“m”,但这只是中间对齐列。我想知道我是否需要为所有行指定一些特殊的东西是 row_spec() align = "m",但是当我这样做时,它会抱怨......有什么想法吗?

Mic*_*per 6

似乎没有办法直接在 kable 和 kableExtra 中执行此操作。但是,当通过 kable 将表格构建为 PDF 时,它使用 LaTeX 来构建结果。因此,我们可以将 LaTeX 函数直接集成到表格中。

此解决方案使用multirow包。要垂直居中的单元格可以包裹在 中\\multirow{1}{*}[0pt]{Cell content},如下所示:

---
header-includes:
  - \usepackage{multirow}
output: pdf_document
---

```{r}
library(knitr)
library(kableExtra)

df <- data.frame(a = letters[1:5], b = 1:5)
names(df) <- c("A very very very very very very very very very very very very very very very very very very long title",
               "\\multirow{1}{*}[0pt]{A short title}")


df %>% kable(format = 'latex', linesep = "", align = 'c', escape = F) %>% kable_styling(full_width = T)
```
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

为了更轻松地使用它,您可以创建一个函数来为您进行重命名:

centerText <- function(text){
    paste0("\\multirow{1}{*}[0pt]{", text, "}")
  }
Run Code Online (Sandbox Code Playgroud)

因此,要重命名您运行的列: centerText("A short title")

  • `"\\multirow{1}{*}[0pt]{A短标题}"` 对我不起作用,但 `"\\multirow{2}{*}[0pt]{A短标题}"`做。 (2认同)

小智 6

这可以通过添加extra_css参数在 HTML 中轻松实现。(对于那些在 HTML 中搜索类似解决方案并且只找到这篇文章的人)

column_spec(1,extra_css = "vertical- align:middle;")
Run Code Online (Sandbox Code Playgroud)

  • 在我意识到“vertical-align:middle;”中的空间不应该存在之后,这非常有效。我使用了 `extra_css = "vertical-align:middle;"` 来代替。 (2认同)

小智 5

截至2020 年 8 月,包column_spec()中的函数kableExtra有一个latex_valign参数。仅当您还指定了列宽时,这才有效,因此它与kable_styling(full_width = T)

library(knitr)
library(kableExtra)

df <- data.frame(a = letters[1:5], b = 1:5)
names(df) <- c("A very very very very very very very very very very very very very very very very very very long title",
               "A short title")

df %>% 
  kable(format = 'latex', 
        linesep = "", 
        align = 'c') %>% 
  column_spec(1:2,
              width = "3in",
              latex_valign = "m")
Run Code Online (Sandbox Code Playgroud)