且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2023-11-10 21:15:16

以下是真正的解决方案:

Here comes the real solution:

Knitr 0.3.9 开始为每个块支持多个设备(目前,您必须从GitHub);根据您的情况,您可以将块选项dev=c('pdf', 'png')设置为同时获取PDF和PNG文件.

Knitr 0.3.9 starts to support multiple devices per chunk (for now, you have to install from GitHub); in your case, you can set the chunk option dev=c('pdf', 'png') to get both PDF and PNG files.

这是一个使用ImageMagick将PDF文件转换为PNG的解决方案.当然,您必须首先安装ImageMagick,并确保其bin目录位于PATH中:

Here is a solution that uses ImageMagick to convert PDF files to PNG. Of course you have to install ImageMagick first, and make sure its bin directory is in 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.您可以像这样使用它

Basically this hook is executed after a chunk and run convert foo.pdf foo.png on all PDF figures. You can use it like

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

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

Or if you put all figures in a separate directory, you can run convert directly in that directory (i.e. do not have to call system() in R).

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

This is not an ideal solution but should work. To make use of R's native png() device, you need to answer my question in the above comment first.