3

我正在使用knitr我的分析。\SweaveOpts{dev=pdf}我可以用 pdf 格式和 png 格式保存图形\SweaveOpts{dev=png}。我有兴趣在一次运行中以 pdf 和 png 格式保存图形,但要以交互方式在最终文档中使用 pdf。任何建议将不胜感激。谢谢

4

1 回答 1

4

真正的解决方案来了:

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
})

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

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

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

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

于 2012-03-12T01:43:02.927 回答