Потоковые графики с 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.

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