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