Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
899 views
in Technique[技术] by (71.8m points)

r - How to change fontface (bold/italics) for a cell in a kable table in rmarkdown?

Is there a way to format a single cell in a table in rmarkdown? I am using kable to generate a table as follows:

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

I wish to bold "c" in the last row and also add a horizontal line at the end of the table. Any pointers?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Just generalising the question to include other font faces. Pandoc offers other ways to easily reformat text, and as explained in the RMarkdown Cheatsheet:

  • italics can be achieved using *italics*
  • bold can be achieved using **bold**
  • strikethrough can be achieved using ~~strikethrough~~

This output will support the various output methods, including PDF, html and word:

Here is a basic example:

---
output: pdf_document: default
---

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

enter image description here

Applying formatting with a function

To make it easier to select cells to reformat, I have put together the following function 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)
}

It allows the user to select the cell row and columns which need to be reformatted and select the styling to apply. Multiple cells can be selected at the same time if several values in a row/column need to be reformatted. Here is an example:

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()

Further Reading: the kableExtra package has been written to offer a lot of extra controls of styling of tables. However, the advice is different for the different types of output, and therefore there are different approaches for HTML and LaTeX


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...