从R到Java的流绘图而不保存绘图

时间:2014-04-25 15:40:44

标签: java r graphics stream rcaller

我正在使用Rcaller和Vaadin框架来制作一个程序,用于从浏览器运行R脚本。一个特征应该是绘制图的能力。这本身并不是非常困难,有很多方法可以用Rcaller来做到这一点。但是,据我所知,所有这些方法都涉及将结果图从R保存到文件系统,然后用Java显示。

这是最不方便的,并且耗费大量时间和资源。我希望有一种方法可以将R作为流绘制并将其指向Java,而无需在其间保存任何内容。

这有可能吗?

我查找了一个函数" grid.cap()"。它拍摄当前显示的绘图的快照并将颜色作为矩阵返回。然后可以将它们转换为RGB值。是否可以流式传输这些值,而不是绘图本身?这种方法至少有一个问题,它确实很慢。此外,我非常怀疑究竟会返回什么,因为它取决于显示设备的状态。

1 个答案:

答案 0 :(得分:2)

似乎无法使用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运行的当前设备之一找到图形设备或配置设置。