【问题标题】:How to export an xtable as PDF directly via R script?如何通过 R 脚本直接将 xtable 导出为 PDF?
【发布时间】:2019-08-31 14:19:13
【问题描述】:

我有一个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

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

【问题讨论】:

  • 为什么要直接渲染呢? knitr 工作流程有什么问题?我之所以这样问,是因为您可能会更幸运地在当前工作流程中解决这些问题并自动化编织,而不是通过例如制作漂亮的表格。表 grobs。
  • 这更像是一种绝望的行为。我对 knitr 工作流程没有任何问题,我只是想避免手动处理单独的 .Rmd 文件。我知道print.xtable 中有一个file 选项,我们可以将表格保存为.tex 文件。我也不知道自动化编织过程的方法。我可以假设您知道我想到的解决方案吗?
  • 确实,只需在整个文档(或部分)上使用rmarkdown::render。这将生成一个 PDF,无需任何手动操作。关于您的特定代码,问题是 writeLines(cat 部分。目前尚不清楚您的思维过程是什么,但writeLinescat 本质上是执行相同(或相似)功能的替代方案。你会使用它们中的任何一个,而不是同时嵌套两者。您可能打算使用c 而不是cat

标签: r pdf knitr xtable


【解决方案1】:

这是一种可能,没有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)

【讨论】:

  • 为了避免inputenc 错误,我们需要将"\\UseRawInputEncoding" 添加到writeLines 部分as suggested on TeX Stack Exchange
  • 有没有办法在tools::texi2pdf中设置输出路径?
【解决方案2】:

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

require(ggplot2)
require(gridExtra)

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

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

【讨论】:

    【解决方案3】:

    这是一个使用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)
    

    【讨论】:

    • 谢谢,不过,请给我incomplete final line found on 'file2ca4496620b8.log'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 2017-02-18
    • 2016-12-10
    • 1970-01-01
    • 2017-03-09
    • 2013-07-30
    相关资源
    最近更新 更多