【问题标题】:RMarkdown kable vertically align cellsRMarkdown kable 垂直对齐单元格
【发布时间】:2018-08-15 01:40:27
【问题描述】:

我正在使用 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)

这就是输出的样子:

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

【问题讨论】:

  • 尽量简洁:这样更容易提供帮助。我已经编辑了这个问题,还包括了一个可重现的例子。
  • @MikeyHarper - 感谢您的编辑,我会在以后的帖子中记住这一点。
  • 太好了,我总是喜欢编辑帖子来展示如何改进它们。此外,您可能想查看以下内容:rprogramming.net/rename-columns-in-r 在您的原始代码中,您分别重命名了所有列,这是一种冗长的方法。只需用列表重命名它们
  • @MikeyHarper - 我在 SO 和 Google 中都进行了大量搜索,但从未见过该帖子。感谢您的示例-对我来说看起来是一样的。不知道我在 2 天的搜索中如何从未遇到过那个。

标签: latex r-markdown kable kableextra


【解决方案1】:

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

column_spec(1,extra_css = "vertical- align:middle;")

【讨论】:

  • 非常感谢!我正在搜索如何将文本垂直对齐 HTML 表格中单元格的顶部,并遇到了您的解决方案 - 就像一个魅力!谢谢! :)
  • 在我意识到 "vertical- align:middle;" 中的空间不应该存在之后,这非常有效。我改用extra_css = "vertical-align:middle;"
【解决方案2】:

似乎没有办法直接在 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)
```

为了更容易使用,您可以创建一个函数来为您重命名:

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

所以要重命名您运行的列:centerText("A short title")

【讨论】:

  • 啊,所以如果我获取单元格的所有内容并在它们上执行 paste0() 以将它们包装在此函数中,那么一切都应该居中正常......非常整洁。我知道我通常可以做到这一点,我只是不确定要使用什么包或 Latex 功能。很酷。谢谢!
  • 是的,我刚刚添加了一个可以为您进行粘贴的函数
  • 你和我的想法一样......已经编写了一个函数。想过只是使用 paste0() 来替换单元格的内容,但是一个函数听起来更好......很好的调用。
  • 一些更新 - 上面的解决方案确实有效,但前提是您不需要 kable “清理”您的表格内容。就我而言,我这样做了,所以当我使用“escape = TRUE”选项时,我实际上得到了“\multicolumn ....”打印出来。如果我使用“escape = FALSE”,那么我会遇到一大堆其他问题,因为表格中的文本没有得到清理。我尝试先清理文本(使用 xtable sanitize 函数),然后使用上面的函数添加多列。这行得通,但是我的所有列格式(宽度等)都消失了,因为 multicolumn 调用了 {*}。
  • "\\multirow{1}{*}[0pt]{A short title}" 对我不起作用,但 "\\multirow{2}{*}[0pt]{A short title}" 可以。
猜你喜欢
  • 2019-04-24
  • 2011-07-30
  • 2018-07-11
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
  • 2013-04-03
相关资源
最近更新 更多