Сохранение графиков в формате PDF и PNG, но с использованием файлов PDF в окончательном документе - PullRequest
2 голосов
/ 12 марта 2012

Я использую knitr для анализа.Я могу сохранить графики в формате PDF с \SweaveOpts{dev=pdf} и в формате PNG с \SweaveOpts{dev=png}.Мне интересно сохранять графики как в формате pdf, так и в формате png за один прогон, но использовать PDF в итоговых документах в интерактивном режиме.Любое предложение будет высоко оценено.Спасибо

1 Ответ

3 голосов
/ 12 марта 2012

Здесь приходит реальное решение:

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(), вам нужно сначала ответить на мой вопрос в приведенном выше комментарии.

...