如何在rmarkdown中更改kable表中单元格的字体(粗体/斜体)?

时间:2015-01-27 08:34:41

标签: r markdown knitr r-markdown

有没有办法在rmarkdown中格式化表格中的单个单元格?我正在使用kable生成一个表,如下所示:

library(knitr)
kable(data.frame(c('a','b','c'),c(1,2,3)))

我希望在最后一行加粗“c”,并在表格的末尾添加一条水平线。有什么指针吗?

3 个答案:

答案 0 :(得分:4)

使用pander突出显示单元格,行或列非常straightforward

> df <- data.frame(c('a','b','c'),c(1,2,3))
> emphasize.strong.cells(which(df == 3, arr.ind = TRUE))
> pander(df)

-------------------------------
 c..a....b....c..   c.1..2..3. 
------------------ ------------
        a               1      

        b               2      

        c             **3**    
-------------------------------

但是在表格中添加水平线超出了markdown table specifications的范围。

答案 1 :(得分:3)

简单地概括问题以包括其他字体。 Pandoc提供了其他方法来轻松重新格式化文本,如RMarkdown Cheatsheet

中所述
  • 斜体可以使用*italics*
  • 来实现
  • 粗体可以使用**bold**
  • 来实现
  • 删除线可以使用~~strikethrough~~
  • 来实现

此输出将支持各种输出方法,包括 PDF html

这是一个基本的例子:

---
output: pdf_document: default
---

```{r}
knitr::kable(data.frame(char = c('*a*','**b**','~~c~~'),
                 num = c(1,2,3)))
```

enter image description here

使用函数

应用格式设置

为了更容易选择要重新格式化的单元格,我将以下函数format_cells放在一起。

format_cells <- function(df, rows ,cols, value = c("italics", "bold", "strikethrough")){

  # select the correct markup
  map <- setNames(c("*", "*", "~~"), c("italics", "bold", "strikethrough"))
  markup <- map[value]  

  for (r in rows){
    for(c in cols){

      # Make sure values are not factors
      df[[c]] <- as.character( df[[c]])

      # Update formatting
      df[r, c] <- paste0(markup, df[r, c], markup)
    }
  }

  return(df)
}

它允许用户选择需要重新格式化的单元格行和列,并选择要应用的样式。如果需要重新格式化行/列中的多个值,则可以同时选择多个单元格。这是一个例子:

library(tidyverse)

df <- data.frame(char = c('a','b','c'),
                 num = c(1,2,3))

df %>%
  format_cells(1, 1, "italics") %>%
  format_cells(2, 2, "bold") %>%
  format_cells(3, 1:2, "strikethrough") %>%
  knitr::kable()
  

进一步阅读:已编写kableExtra包,以提供大量表格样式的额外控制。但是,对于不同类型的输出,建议是不同的,因此HTMLLaTeX有不同的方法

答案 2 :(得分:-1)

这也有效:第一个参数是行号,因此您可以通过编程将行加粗 或使用column_spec的列。

library(kableExtra)

library(tidyverse)


kable(data.frame(letter =c('a','b','c'),number =c(1,2,3)))%>%
  kable_styling()%>%
  row_spec(3,bold=T,hline_after = T)