使用RMarkdown将带有颜色和unicode字符的kableExtra表渲染为PDF

时间:2018-06-03 20:48:23

标签: r latex r-markdown knitr kable

我最近学会了如何使用包含unicode符号的kableExtra创建令人敬畏的表,以便它们可以作为我的绘图的解释表。

library(dplyr)
library(kableExtra)

data.frame(
  Symbol = c("●", "●", "▲"),
  Description = c("bla bla bla", "bla bla bla", "bla bla bla"),
  Result = c("bla bla bla", "bla bla bla", "bla bla bla")
) %>%
  mutate(
    Symbol = cell_spec(Symbol, color = c("yellow", "pink", "pink"), escape = F)
  ) %>%
  kable(escape = F, align = c("c", "l", "l")) %>%
  kable_styling(full_width = F)

在漂亮的表格中显示如下:enter image description here

我现在想将其自动呈现为PDF,但是当我将这些确切的代码粘贴到RMarkdown文件集中以编织为PDF时,这让我陷入了长达一小时的试图调试与之相关的乳胶错误的兔子洞。表中的unicode字符,导致问题的颜色规范中的数字符号,脚注,状态! Misplaced \noalign.的错误,我还没有找出其来源等等。

我将在此末尾包含完整Rmd文件的文本。如果有所作为,我会在Mac上使用它。使用BasicTex和tlmgr安装缺少的乳胶包。

是否存在(1)保存我的kableExtra表的方法,该表在RStudio中呈现时看起来我想要的是一个可扩展的PDF文件,它不涉及RMarkdown?我今天玩了write2pdf()函数,但又遇到了unicode问题。我也尝试将它编织成html并通过调用pandoc转换它,但这删除了我需要的大部分表格格式。

也许我错过了一些简单的解决方案,但是......或者(2)是否有人能够告诉我哪些更改会使此Rmd代码正确地将我的图表呈现为PDF? R代码本身工作正常。我想这是一种乳胶问题。

非常感谢您的帮助。

---
title: ""
output:
  pdf_document:
    latex_engine: xelatex
---

```{r, echo=FALSE, results="asis"}
# TODOREQ: add "much" grammars for acute levels
# TODOREQ: change "levels of concern" to the respective guideline name.
# TODO: Change to groupby/summarize
# TODO: Factor out package loading and global variables into a single setup file

# Packages
suppressMessages(library(ggplot2))
suppressMessages(library(extrafont))
suppressMessages(library(kableExtra))
suppressMessages(library(dplyr))


  table_info <- data.frame(Symbol=c("&#9650", "&#9670", "&#2795"),
                       Name=c("Name1", "Name2", "Name3"),
                       Description=c("Description1", "Description2",
                                     "Description3"),
                       Results=c("Bad", "Good", "Bad"),
                       Color=c("#ffde71", "#394f38",
                               "#09a2dd"))

  ktable <- table_info %>%
    mutate(Symbol = cell_spec(Symbol, color = Color, escape = FALSE)) %>%
    select(-Color) %>%
    kable(escape = FALSE, align = c("c", "l", "l")) %>%
    kable_styling(full_width = FALSE)

  ktable


```

1 个答案:

答案 0 :(得分:9)

有一些问题。

  1. cell_spec将插入原始HTML代码,除非您要求它插入LaTeX代码。使用format = "latex"来执行此操作。

  2. 您需要在LaTeX代码中指定符号,而不是HTML标记。 xelatex应支持"\\symbol{9650}" "&#9650"之类的内容,但我无法显示任何内容:也许我没有安装字体。相反,你可以使用AMS符号;填充的圆圈为"$\\bullet$",向上指向的填充三角形为"$\\blacktriangle$"。我没有查找你的其他人,但如果你很幸运,你会在https://www.rpi.edu/dept/arc/training/latex/LaTeX_symbols.pdf找到它们。

  3. 常规kable表在LaTeX中很难看;使用booktabs = TRUE选项获得更好的选项。
  4. 所以这就是你的ktable规范应该是这样的:

      table_info <- data.frame(Symbol=c("$\\bullet$", "$\\bullet$", "$\\blacktriangle$"),
                           Name=c("Name1", "Name2", "Name3"),
                           Description=c("Description1", "Description2",
                                         "Description3"),
                           Results=c("Bad", "Good", "Bad"),
                           Color=c("#ffde71", "#394f38",
                                   "#09a2dd"))
    
      ktable <- table_info %>%
        mutate(Symbol = cell_spec(Symbol, color = Color, format = "latex", 
                                  escape = FALSE)) %>%
        select(-Color) %>%
        kable(escape = FALSE, align = c("c", "l", "l"), booktabs = TRUE) %>%
        kable_styling(full_width = FALSE)
    
      ktable