2012-03-11 34 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