【问题标题】:How to change fontface (bold/italics) for a cell in a kable table in rmarkdown?如何在 rmarkdown 中更改 kable 表中单元格的字体(粗体/斜体)?
【发布时间】:2015-01-27 08:34:41
【问题描述】:

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

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

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

【问题讨论】:

  • 假设你的意思是kable(data.frame(c('a','b','c'),c(1,2,3))),那么是否可以只做c('a', 'b', '**c**')?至于水平线,我无法用 kable 帮助你(我不确定这是否可能),但我认为使用 pander 包非常简单。
  • @DanielleMcCool 是的,我的意思是字符串。双星有效。我会结帐迎合。谢谢。
  • @DanielleMcCool 是否可以使用 kable/pandoc 在单列中包含多列?
  • @Avinash,Stack Overflow 旨在一次提出一个问题。如果您还有其他问题,请submit a new one

标签: r markdown knitr r-markdown


【解决方案1】:

只是概括问题以包括其他字体。 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)))
```

使用函数应用格式

为了更容易选择要重新格式化的单元格,我整理了以下函数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)
}

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

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 有不同的方法

【讨论】:

  • 您的简单文本格式示例如何与 kableExtra c("*", "*", "~~") 一起使用?使用 kableExtra 无法识别这些格式选项。它允许通过 cell_spec() 格式化表格中的整个单元格,但不是其中的一部分?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    使用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的范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-07
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多