Генерация сюжетного изображения с 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