Потоковые графики с R на Java без сохранения графика
Я использую Rcaller с Vaadin Framework для создания программы для запуска R-скриптов из браузера. Одной из особенностей должна быть возможность рисовать графики. Это не очень сложно само по себе, есть способы сделать это с Rcaller. Однако, насколько я видел, все эти способы включают сохранение полученного графика из R в файловую систему и его отображение в Java.
Это наиболее неудобно и требует много времени и ресурсов. Я хотел бы получить способ получить график из R в виде потока и направить его на Java без необходимости что-либо сохранять между ними.
Это каким-либо образом возможно?
Я посмотрел функцию "grid.cap()". Он делает снимок текущего отображаемого графика и возвращает цвета в виде матрицы. Затем они могут быть преобразованы в значения RGB. Можно ли будет передавать эти значения вместо самого сюжета? У этого подхода есть как минимум одна проблема, он действительно медленный. Также я очень сомневаюсь, что именно будет возвращено, так как это зависит от состояния устройства отображения.
1 ответ
Кажется, это не может быть сделано с grid.cap(), в любом случае, проблема может быть решена с некоторой конфигурацией. Я создал тестовый файл так:
RCaller caller = new RCaller();
RCode code = new RCode();
caller.setRscriptExecutable("C:\\Program Files\\R\\R-3.0.2\\bin\\Rscript.exe");
code.R_require("grid");
code.addRCode("dev.new(width=.5, height=.5)");
code.addRCode("grid.rect()");
code.addRCode("grid.text(\"hi\")");
code.addRCode("cap <- grid.cap()");
code.addRCode("returns <- list(cap=cap)");
code.addRCode("dev.off()");
caller.setRCode(code);
caller.runAndReturnResult("returns");
int[] dims = caller.getParser().getDimensions("cap");
System.out.println("Names: " + caller.getParser().getNames());
System.out.println("Returned matrix dimensions: "+dims[0]+" - "+dims[1]);
и этот код производит этот вывод:
Names: []
Returned matrix dimensions: 0 - 0
и запуск созданного сценария вручную производит это:
В grid.Call(L_cap): захват растра недоступен для этого устройства
Rscript не может определить правильное устройство для печати, однако сгенерированный скрипт RCaller корректно запускается и выдает ожидаемый результат при непосредственном запуске в RGui.
> dim(returns$cap)
[1] 47 116
> head(returns$cap)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] "gray67" "gray67" "gray67" "gray67" "gray67" "gray67" "gray67" "gray67" "gray67" "gray67"
[2,] "gray67" "gray67" "gray67" "gray67" "gray67" "gray67" "gray67" "gray67" "gray67" "gray67"
На мой взгляд, пожалуйста, прости меня, если я ошибаюсь, проблема заключается в том, чтобы найти графическое устройство или параметр конфигурации для одного из текущих устройств, которое работает с Rscript.