Генерация сюжетного изображения с PL/R

Я пытаюсь использовать хранимые процедуры PL/R в PostgreSQL для создания графиков. Процедура должна выводить необработанные байты или base64, соответствующие изображению графика, для использования другим компонентом (веб-сервис).

Используя в R, как построить в буфер памяти вместо файла? я смог достичь своей цели в R, но не в PL/R: сюжет, кажется, правильно сгенерирован как в R, так и в PL/R, но writePNG() терпит неудачу в PL/R

Этот код в R дает результат: l=7387

library(Cairo)
library(png)
library(ggplot2)
Cairo(file='/dev/null')
qplot(rnorm(5000))
i = Cairo:::.image(dev.cur())
r = Cairo:::.ptr.to.raw(i$ref, 0, i$width * i$height * 4)
dim(r) = c(4, i$width, i$height)
r[c(1,3),,] = r[c(3,1),,]
p = writePNG(r, raw()) # raw PNG bytes
l=length(p)
l

Этот код в PL/R дает l=1271!!

CREATE OR REPLACE FUNCTION public.f_ggplot2_test3()
RETURNS int LANGUAGE 'plr' STRICT 
AS $BODY$
library(Cairo)
library(png)
library(ggplot2)
Cairo(file='/dev/null')
qplot(rnorm(5000))
i = Cairo:::.image(dev.cur())
r = Cairo:::.ptr.to.raw(i$ref, 0, i$width * i$height * 4)
dim(r) = c(4, i$width, i$height) # RGBA planes
r[c(1,3),,] = r[c(3,1),,]
p=writePNG(r, raw())
length(p)
$BODY$;

Изменяя код, можно проверить, что в обоих случаях:length(p) = 1228800

Очевидно, что writePNG Функция не работает, как задумано в PL/R, но я не понимаю, почему.

Конечно, код был протестирован на той же машине, на которой размещены PostgreSQL+PL/R и R, поэтому первый использует последний, если я правильно понимаю.

  • Версия PostgreSQL: 9.3
  • Версия R: 3.4.4
  • Версия PL/R: 1:8.3.0.17-3.pgdg16.04+1 (версия для показа)
  • Пакеты R (Cairo, png, ggplot2) до последней версии с использованием packages.install()
  • ОС Linux Mint 17.3, ядро ​​3.19

0 ответов

Другие вопросы по тегам