如何更改 rmarkdown 中 kable table 中单元格的字体 (bold/italics)?
How to change fontface (bold/italics) for a cell in a kable table in rmarkdown?
有没有办法在 rmarkdown 中格式化 table 中的单个单元格?我正在使用 kable 生成一个 table 如下:
library(knitr)
kable(data.frame(c('a','b','c'),c(1,2,3)))
我想在最后一行加粗 "c" 并在 table 的末尾添加一条水平线。有什么指点吗?
使用 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**
-------------------------------
但是在 table 中添加水平线超出了 markdown table specifications 的范围。
只是将问题概括为包括其他字体。 Pandoc 提供了其他方法来轻松重新格式化文本,如 RMarkdown Cheatsheet:
中所述
- 斜体可以使用
*italics*
实现
- 粗体可以使用
**bold**
实现
- 可以使用
~~strikethrough~~
来实现删除线
此输出将支持多种输出方式,包括PDF、html和word:
这是一个基本示例:
---
output: pdf_document: default
---
```{r}
knitr::kable(data.frame(char = c('*a*','**b**','~~c~~'),
num = c(1,2,3)))
```
使用函数应用格式
为了更容易 select 单元格重新格式化,我整理了以下函数 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)
}
它允许用户 select 需要重新格式化的单元格行和列以及 select 要应用的样式。如果 row/column 中的多个值需要重新格式化,则可以同时 select 编辑多个单元格。这是一个例子:
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
这也有效:第一个参数是行号,因此您可以通过编程方式将行加粗
或列使用 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)
有没有办法在 rmarkdown 中格式化 table 中的单个单元格?我正在使用 kable 生成一个 table 如下:
library(knitr)
kable(data.frame(c('a','b','c'),c(1,2,3)))
我想在最后一行加粗 "c" 并在 table 的末尾添加一条水平线。有什么指点吗?
使用 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**
-------------------------------
但是在 table 中添加水平线超出了 markdown table specifications 的范围。
只是将问题概括为包括其他字体。 Pandoc 提供了其他方法来轻松重新格式化文本,如 RMarkdown Cheatsheet:
中所述- 斜体可以使用
*italics*
实现
- 粗体可以使用
**bold**
实现
- 可以使用
~~strikethrough~~
来实现删除线
此输出将支持多种输出方式,包括PDF、html和word:
这是一个基本示例:
---
output: pdf_document: default
---
```{r}
knitr::kable(data.frame(char = c('*a*','**b**','~~c~~'),
num = c(1,2,3)))
```
使用函数应用格式
为了更容易 select 单元格重新格式化,我整理了以下函数 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)
}
它允许用户 select 需要重新格式化的单元格行和列以及 select 要应用的样式。如果 row/column 中的多个值需要重新格式化,则可以同时 select 编辑多个单元格。这是一个例子:
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
这也有效:第一个参数是行号,因此您可以通过编程方式将行加粗 或列使用 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)