使用condformat与Knitr在pdf上创建表格?

时间:2016-05-06 12:59:12

标签: r knitr

我找到了包condformat,可以轻松地从data.frames创建彩色表。

您可以运行其中一个示例。

data(iris)
library(condformat)
condformat(iris[c(1:5,70:75, 120:125),]) +
  rule_fill_discrete(Species) + 
  rule_fill_discrete(Sepal.Width, Sepal.Length,expression = Sepal.Width > Sepal.Length - 2.25, colours = c("TRUE" = "#7D00FF")) + rule_fill_gradient2(Petal.Length)

enter image description here

如果我生成一个html,我可以在降价文档中使用它。

但是我无法用它来生成pdf。 我已经尝试过knitr和rmarkdown。 Knitr产生错误:

Overfull \hbox (22.4968pt too wide) in paragraph at lines 62--62
Missing $ inserted.

和许多

You can't use `macro parameter character #' in math mode.

当我尝试将代码嵌入到rmarkdown块中时,它不会产生任何错误,但输出只是一个包含许多数字的单列,没有颜色。

我已经尝试过结果='asis',没有它。

如何在使用Rnw Knitr创建pdf时获取这些表格?

有时我会用xtable或ztable得到类似的结果,但如果你想选择性地为单元格着色,前者是非常困难的,而后者有时候效果不好。例如,我无法在ztable表格中以科学格式打印数字。

1 个答案:

答案 0 :(得分:2)

我认为你很难将condformat打印到PDF是因为它不支持PDF输出。它只支持HTML输出(除非我在手册中没有看到任何内容)。

所以,如果你原谅一些无耻的自我推销,我会向你推荐pixiedust包。缺点是pixiedust没有一些简洁的功能,比如自动颜色选择或condformat具有的渐变,但这些都是我现在正在进行清单的事情。

pixiedust的优点是它支持使用相同语法的HTML和LaTeX / PDF输出。下面的RMarkdown脚本将生成一个类似于condformat中的示例的表,您可以在Knit PDF和Knit HTML之间切换以获得相同的演示文稿。

---
title: "Untitled"
output: pdf_document
date: "May 6, 2016"
header-includes: 
- \usepackage{amssymb} 
- \usepackage{arydshln} 
- \usepackage{caption} 
- \usepackage{graphicx} 
- \usepackage{hhline} 
- \usepackage{longtable} 
- \usepackage{multirow} 
- \usepackage[dvipsnames,table]{xcolor} 
- \makeatletter 
- \newcommand*\vdashline{\rotatebox[origin=c]{90}{\$\dabar@\dabar@\dabar@\$}} 
- \makeatother
---

```{r}
library(pixiedust)
library(RColorBrewer)
data(iris)

output <- iris[c(1:5,70:75, 120:125),]

dust(output) %>%
  sprinkle_table(pad = 3) %>%
  sprinkle(
    cols = "Species",
    bg = c(rep("rgb(249,118,110)", sum(output$Species == "setosa")),
           rep("rgb(1,186,56)", sum(output$Species == "versicolor")),
           rep("rgb(98,156,255)", sum(output$Species == "virginica"))),
    recycle = "rows"
  ) %>%
  sprinkle(
    cols = c("Sepal.Length", "Sepal.Width"),
    rows = which(with(output, Sepal.Width > Sepal.Length - 2.25)),
    bg = "#7D00FF"
  ) %>%
  sprinkle(
    cols = "Petal.Length",
    bg = cut(output$Petal.Length, breaks = 9,
             labels = brewer.pal(9, "BrBG")) %>%
           as.character(),
    recycle = "rows"
  ) %>%
  medley_bw()
```