OpenCPU и многостраничные графики

Я пытаюсь захватить мультиграфический PDF-файл из функции. В R это дает мне трехстраничный PDF:

pdf(file='test.pdf', onefile=TRUE)
lapply(1:3, 'plot')
dev.off()

Использование OpenCPU:

$ curl http://localhost:6977/ocpu/library/base/R/lapply -H 'Content-Type: application/json' -d '{"X":[1,2,3], "FUN":"plot"}'
/ocpu/tmp/x0dc3dad0/R/.val
/ocpu/tmp/x0dc3dad0/graphics/1
/ocpu/tmp/x0dc3dad0/graphics/2
/ocpu/tmp/x0dc3dad0/graphics/3
/ocpu/tmp/x0dc3dad0/stdout
/ocpu/tmp/x0dc3dad0/source
/ocpu/tmp/x0dc3dad0/console
/ocpu/tmp/x0dc3dad0/info

Я могу получить любую из отдельных страниц в виде одностраничного PDF-файла, но не в виде одного комбинированного файла.

Два возможных обходных пути, не без проблем:

  1. Используйте par(mfrow), layout() или аналогичный механизм, хотя в конце концов это создаст изображение монстра (в моем коде я имею дело с более чем тремя изображениями).

  2. Используйте tempfile, создайте файл Rmd на лету, верните имя файла в сеансе (еще не тестировали это) и используйте обработку файлов Rmd в OpenCPU. К сожалению, теперь это использует геометрию LaTeX и нумерацию страниц (для этого существуют обходные пути).

Есть ли другие способы сделать это?


person r2evans    schedule 02.04.2014    source источник


Ответы (1)


Хороший вопрос. OpenCPU захватывает графику, используя evaluate, которая сохраняет каждую графику отдельно. Сам API не поддерживает объединение нескольких изображений в одном файле. Лично я бы выполнил такую ​​PDF постобработку на уровне приложения (т. е. с помощью инструментов, отличных от R), но, возможно, было бы полезно поддерживать это в API.

Некоторые предложения:

  • Любой файл, который ваша функция/скрипт R сохраняет в рабочий каталог (например, getwd()), также станет доступен через API. Итак, одна вещь, которую вы можете сделать, это вручную создать в своем коде R объединенный файл pdf и сохранить его в рабочем каталоге, а затем загрузить его через opencpu.

  • Графика на самом деле является recordedPlot объектами, и помимо png, pdf и svg вы также можете получить графику как rds или rda. Таким образом, вы можете написать функцию R, которая загружает объект recordedPlot из API, а затем распечатывает его. Не уверен, что это будет полезно в вашем случае использования.

person Jeroen    schedule 02.04.2014
comment
Это то, что я подозревал, и, поскольку я не владею recordedPlot, я хотел убедиться. Я также подозревал, что дело в рабочем каталоге, поэтому я думаю, что tempfile() и Rmd могут иногда работать. Это также объясняет, почему графики, которые хорошо отображаются (т. е. рассчитываются интервалы между текстом/элементами) при тестировании, не всегда также хорошо отображаются с помощью этого механизма. (Постобработка нескольких PDF-файлов с помощью инструментов, отличных от R, будет зависеть от наличия соответствующих инструментов на клиентском компьютере, а не от того, на что я могу положиться.) Спасибо. - person r2evans; 03.04.2014