Сохранение графиков как в формате pdf, так и в формате png, но с использованием файлов pdf в конечном документе

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


person MYaseen208    schedule 11.03.2012    source источник
comment
У вас есть несколько участков на кусок? Если вы этого не сделаете, я могу показать вам простой подход с использованием чанк-хука; если вы это сделаете, мне нужно будет изменить внутренний код, чтобы разрешить несколько устройств на блок, например. от dev=c('pdf', 'png').   -  person Yihui Xie    schedule 12.03.2012
comment
Спасибо @Yihui за ваш комментарий. Да, у меня есть несколько участков на кусок.   -  person MYaseen208    schedule 12.03.2012
comment
Ответ ниже представляет собой общее решение, которое не требует одного графика на блок, и я подумаю о том, как добавить встроенную поддержку в Knitr для нескольких устройств; возможно это можно сделать в вязалке 0.4.   -  person Yihui Xie    schedule 12.03.2012
comment
Это было бы прекрасно. Спасибо Yihui за вашу хорошую работу.   -  person MYaseen208    schedule 12.03.2012
comment
Хорошо, теперь я реализовал поддержку нескольких устройств. См. измененный ответ ниже.   -  person Yihui Xie    schedule 12.03.2012


Ответы (1)


Вот настоящее решение:

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

Это не идеальное решение, но оно должно работать. Чтобы использовать родное устройство png() R, вам нужно сначала ответить на мой вопрос в комментарии выше.

person Yihui Xie    schedule 12.03.2012
comment
Предполагая работу с файлом Rnw и создание документа в формате PDF: есть ли возможность указать, какие файлы будут использоваться для создания документа? У меня есть rpeort с большим количеством графики, и я хотел бы подготовить его с высоким и низким разрешением (например, один с использованием png и один pdf). - person radek; 11.11.2013
comment
@radek Вы можете сделать это с помощью трюков LaTeX: en.wikibooks.org/wiki/LaTeX/Importing_Graphics< /а> - person Yihui Xie; 11.11.2013
comment
Спасибо за быстрый ответ. Я увидел, что в сгенерированном файле tex не указано расширение графики. Будет ли что-то вроде \DeclareGraphicsExtensions{.pdf} создавать отчет только с изображениями в формате PDF? Затем - мне все еще нужно скомпилировать два отдельных текстовых документа - один с опцией pdf, другой с png? - person radek; 12.11.2013
comment
@radek \DeclareGraphicsExtensions это ключ. Вы, конечно, можете автоматизировать это. Ничто не может остановить отважного программиста. Вы можете опубликовать новый вопрос, если хотите. - person Yihui Xie; 12.11.2013