R flextable 中的斜体和颜色

Italic and color in an R flextable

我有一个 table 包含根据年份(列)存在的物种(行)。

这个想法是将每个物种的拉丁名称斜体化,并根据物种的特定特征为线条着色。不幸的是,我不能同时做这两件事。

我设法得到的第一件事是每行的正确颜色:

library(dplyr)
library(flextable)

mydata <- data.frame(Espèce = c("Acipenser Sturio (L. 1758) Esturgeon européen",
"Alosa alosa  (L.1758) Alose vraie", "Alosa fallax (Lac. 1803) Alose feinte",
"Anguilla anguilla  (L. 1758) Anguille", "Lampetra fluviatilis  (L. 1758) Lamproie de rivière",
"Liza ramada (Risso 1826) Mulet porc") , 
`00` = c("",  "+", "+", "+", "",  "+"), 
`01` = c("",  "+", "+", "+", "+", "+"))


flextable(mydata) %>%
  color(color = c(rep("firebrick2",2),rep("black",3),rep("dodgerblue3",1)))


当我尝试添加斜体字体(左括号前的文本)时,斜体字会失去之前定义的颜色:

mydata %>%
  flextable(col_key=c("dummy_col",names(mydata)[-1])) %>%
  color(color=c(rep("firebrick2",2),rep("black",3),rep("dodgerblue3",1)), part="body")%>%
  display(col_key = "dummy_col", pattern = "{{id_}} ({{sciname_}}",
          formatters = list(id_ ~ unlist(strsplit(paste(mydata$Espèce[1:(length(mydata$Espèce))]), split="\("))[seq(1,length(unlist(strsplit(paste(mydata$Espèce[1:(length(mydata$Espèce))]), split="\("))),2)],
                            sciname_ ~ unlist(strsplit(paste(mydata$Espèce[1:(length(mydata$Espèce))]), split="\("))[seq(2,length(unlist(strsplit(paste(mydata$Espèce[1:(length(mydata$Espèce))]), split="\("))),2)]),
          fprops = list(id_ =fp_text(italic = TRUE))) %>%
  color(j="dummy_col", color=c(rep("firebrick2",2),rep("black",3),rep("dodgerblue3",1)))

您有什么建议可以同时获得两者,即正确颜色的斜体文本吗?

是的,您可以使用以下代码来获取您想要的内容:

library(dplyr)
library(tidyr)
library(flextable)

mydata <- data.frame(Espèce = c("Acipenser Sturio (L. 1758) Esturgeon européen",
                                "Alosa alosa  (L.1758) Alose vraie", "Alosa fallax (Lac. 1803) Alose feinte",
                                "Anguilla anguilla  (L. 1758) Anguille", "Lampetra fluviatilis  (L. 1758) Lamproie de rivière",
                                "Liza ramada (Risso 1826) Mulet porc") , 
                     `X00` = c("",  "+", "+", "+", "",  "+"), 
                     `X01` = c("",  "+", "+", "+", "+", "+")) %>% 
  separate(`Espèce`, c("latin_name", "french_name"), sep = "\(") %>% 
  mutate(french_name = paste0("(", french_name) )

应将原始列拆分为两列,以便更容易重复使用。

> mydata
              latin_name                   french_name X00 X01
1      Acipenser Sturio   (L. 1758) Esturgeon européen        
2          Alosa alosa            (L.1758) Alose vraie   +   +
3          Alosa fallax       (Lac. 1803) Alose feinte   +   +
4    Anguilla anguilla              (L. 1758) Anguille   +   +
5 Lampetra fluviatilis   (L. 1758) Lamproie de rivière       +
6           Liza ramada        (Risso 1826) Mulet porc   +   +

然后通过函数composeas_paragraphas_i(斜体),你可以得到你想要的:

flextable(mydata, col_keys = c("dummy", "X00", "X01")) %>%
  compose(j = "dummy", value = as_paragraph(as_i(latin_name), french_name)) %>% 
  color(color=c(rep("firebrick2",2),rep("black",3),rep("dodgerblue3",1)), part="body") %>% 
  autofit()

请注意,函数 display 将被弃用,应替换为 compose