以pdf和png格式保存图形,但在最终文档中使用pdf文件

时间:2012-03-11 21:53:02

标签: r knitr

我正在使用knitr进行分析。我可以使用\SweaveOpts{dev=pdf}保存pdf格式的图表,使用\SweaveOpts{dev=png}保存为png格式的图表。我有兴趣在一次运行中以pdf和png格式保存图表,但是要交互式地在最终文档中使用pdf。任何建议将受到高度赞赏。感谢

1 个答案:

答案 0 :(得分:3)

这是真正的解决方案:

Knitr 0.3.9开始支持每个块的多个设备(现在,你必须从GitHub安装);在您的情况下,您可以设置块选项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
})

基本上这个钩子在一个块之后执行并在所有PDF数字上运行convert foo.pdf foo.png。您可以像

一样使用它
<<test-png, convert=TRUE>>=
  plot(1); plot(2)
@

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

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