r - 以 PDF 和 PNG 格式保存图表,但在最终文档中使用 PDF 文件

标签 r knitr

我正在使用 knitr 进行分析。我可以使用 \SweaveOpts{dev=pdf} 以 PDF 格式保存图形,使用 \SweaveOpts{dev=png} 以 PNG 格式保存图形。我有兴趣在一次运行中以 PDF 和 PNG 格式保存图表,但在最终文档中以交互方式使用 PDF。

我该怎么做?

最佳答案

真正的解决方案来了:

Knitr 0.3.9开始支持每个 block 的多个设备(目前,您必须从 GitHub 安装);在您的情况下,您可以设置 block 选项 dev=c('pdf', 'png') 以获取 PDF 和 PNG 文件。


这是一个使用 ImageMagick 将 PDF 文件转换为 PNG 的解决方案。当然你得先安装ImageMagick,并确保它的bin目录在PATH:

knit_hooks$set(convert = function(before, options, envir) {
  # quit if before a chunk or no figures in this chunk
  if (before || (n <- options$fig.num) == 0L) return()
  # only convert pdf files
  if (options$fig.ext != 'pdf') return()

  # use ImageMagick to convert all pdf to png
  name = fig_path()  # figure filename
  owd = setwd(dirname(name)); on.exit(setwd(owd))
  files = paste(basename(name), if (n == 1L) '' else seq(n), sep = '')
  lapply(files, function(f) {
    system(sprintf('convert %s.pdf %s.png', f, f))
  })
  NULL
})

基本上这个钩子(Hook)是在一个 block 之后执行的,并在所有 PDF 图上运行 convert foo.pdf foo.png。你可以像这样使用它

<<test-png, convert=TRUE>>=
  plot(1); plot(2)
@

或者,如果您将所有图形放在一个单独的目录中,您可以直接在该目录中运行 convert(即不必在 R 中调用 system())。

这不是一个理想的解决方案,但应该可行。要使用 R 的原生 png() 设备,您需要先在上面的评论中回答我的问题。

关于r - 以 PDF 和 PNG 格式保存图表,但在最终文档中使用 PDF 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9659237/

相关文章:

r - 使用自定义函数命名由 `nest` (tidyr) 创建的列中的项目

r - hclust 函数的聚类列表

R:基于多个条件的两个数据帧的子集

r - 读取制表符分隔文件 R 时出现问题

r - 编织 DT::datatable 没有 pandoc

r - R中的百分比格式表

r - 在knitr block 内的循环中评估LaTeX语法并调整绘图dpi

r - 针织/rmarkdown/ latex : How to cross-reference figures and tables?

r - 如何在 Bookdown 中配置 Twitter 按钮?

Stargazer Rmarkdown : LaTeX Error if align is set to TRUE