如何通过R脚本直接将xtable导出为PDF?

时间:2019-04-10 07:39:57

标签: r pdf knitr xtable

我有一个data.frame,它是科学海报的漂亮PDF表格。尽管通过pdf()导出图非常容易,但是我对这张表很执着。

我知道如何使用rmarkdown获取PDF表,例如

---
output: pdf_document
---

```{r tab, echo=FALSE, results='asis'}
library(xtable)
xtable(head(mtcars))
```

但是我想要直接 从R脚本中获取此输出,例如

renderThisToPDF(xtable(head(mtcars), to="nicetable.pdf")  # fantasy code

我该怎么做?

到目前为止,我尝试通过writeLines

间接调用此代码
code <- "library(xtable)\nprint(xtable(head(mtcars)))"

fileConn <- file("output.Rmd")
writeLines(cat("---\noutput: pdf_document\n---\n```{r tab, echo=FALSE, results='asis'}\n", 
               code, "\n```\n"), fileConn)
close(fileConn)

knitr::knit('output.Rmd')

但失败并显示错误。

Error in writeLines(cat("---\noutput: pdf_document\n---\n```{r tab, echo=FALSE,
                        results='asis'}\n",  : 
                          can only write character objects

我想可能有一个更简单的解决方案?

3 个答案:

答案 0 :(得分:2)

没有rmarkdown,这是一种可能。

library(xtable)
latex <- print.xtable(xtable(head(iris)), print.results = FALSE)

writeLines(
  c(
    "\\documentclass[12pt]{article}",
    "\\begin{document}",
    "\\thispagestyle{empty}",
    latex,
    "\\end{document}"
  ),
  "table.tex"
)

tools::texi2pdf("table.tex", clean = TRUE)

或者,使用standalone文档类:

latex <- print.xtable(xtable(head(iris)), print.results = FALSE, 
                      floating = FALSE)
writeLines(
  c(
    "\\documentclass[12pt]{standalone}",
    "\\usepackage{caption}",
    "\\begin{document}",
    "\\minipage{\\textwidth}",
    latex,
    "\\captionof{table}{My caption}",
    "\\endminipage",
    "\\end{document}"
  ),
  "table.tex"
)
tools::texi2pdf("table.tex", clean = TRUE)

答案 1 :(得分:1)

一种解决方案是使用tableGrob中的gridExtra,将表格添加到网格图中,并使用ggsave保存它

require(ggplot2)
require(gridExtra)

ds <- iris[1:10, ]
tg <- tableGrob(ds)
ggsave("test.pdf", tg)

这很简单,但是对于复杂的表格,它不如LaTeX解决方案方便。

答案 2 :(得分:0)

这里是使用huxtable软件包的单线(免责声明:我是作者)

huxtable::quick_pdf(iris[1:10, ])

它将自动在查看器中打开PDF –您可以使用auto_open=FALSE禁用它。

要进行漂亮的格式化,请创建一个huxtable对象:

library(huxtable)
ht <- as_hux(iris[1:10, ])
bold(ht)[1,] <- TRUE       # or whatever else you feel like doing
quick_pdf(ht)