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

Avi*_*ash 9 markdown r knitr r-markdown

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

library(knitr)
kable(data.frame(c('a','b','c'),c(1,2,3)))
Run Code Online (Sandbox Code Playgroud)

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

小智 10

这也有效:第一个参数是行号,因此您可以通过编程方式将行加粗,或使用 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)
Run Code Online (Sandbox Code Playgroud)


Mic*_*per 9

只是将问题概括为包括其他字体。Pandoc 提供了其他方法来轻松重新格式化文本,如RMarkdown Cheatsheet 中所述

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

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

这是一个基本示例:

---
output: pdf_document: default
---

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

在此处输入图片说明

使用函数应用格式

为了更轻松地选择要重新格式化的单元格,我将以下功能放在一起format_cells

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

  # select the correct markup
  # one * for italics, two ** for bold
  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)
}
Run Code Online (Sandbox Code Playgroud)

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

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()
Run Code Online (Sandbox Code Playgroud)

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

  • 你的文本格式化的简单示例如何与 kableExtra ```c("*", "*", "~~")``` 一起使用?使用 kableExtra 无法识别这些格式选项。它允许通过 cell_spec() 格式化表中的整个单元格,但不能格式化其中的一部分? (2认同)

dar*_*zig 4

突出显示单元格、行或列pander非常简单

> 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**    
-------------------------------
Run Code Online (Sandbox Code Playgroud)

但在表格中添加水平线超出了Markdown 表格规范的范围。