2012-03-11 55 views
2

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

+0

您是否有每个块有多个图块?如果你不这样做,我可以通过一个块钩子向你展示一个简单的方法;如果这样做,我将需要更改内部代码以允许每个块有多个设备,例如, 'dev = c('pdf','png')'。 – 2012-03-12 01:14:42

+0

谢谢@熠辉的评论。是的,我确实有每个块有多个地块。 – MYaseen208 2012-03-12 01:50:26

+0

下面的答案是一个通用的解决方案,它不需要每个块都有一个图,我会考虑如何在多设备的knitr中添加原生支持;也许这可以在knitr 0.4中完成。 – 2012-03-12 02:13:52

回答

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(即不必调用system()在R)。

这不是一个理想的解决方案,但应该工作。要使用R的本机png()设备,您需要先在上述注释中回答我的问题。

+1

假设使用'Rnw​​'文件并生成pdf文档:是否有一个选项来指定哪些文件将用于生成文档?我有一个大量的图形运行,并希望prearep它的高分辨率和低分辨率(即一个使用PNG和一个PDF)。 – radek 2013-11-11 15:05:42

+1

@radek你可以用LaTeX技巧做到这一点:http://en.wikibooks.org/wiki/LaTeX/Importing_Graphics – 2013-11-11 18:43:40

+0

感谢您的快速回答。我看到生成的'tex'文件没有指定图形的扩展名。像'\ DeclareGraphicsExtensions {.pdf}'这样的东西只会产生pdf图像报告吗?然后 - 我仍然需要编译两个独立的tex文件 - 一个带有'pdf'选项,一个带'png'? – radek 2013-11-11 20:13:35