使用Java绘制R - 工作,但找不到绘图

时间:2013-09-02 13:51:38

标签: java r runtime.exec

我试图从Java中调用一些r代码,非常像这样:

private void makeMatrix() throws ScriptException {
    try {
        Runtime.getRuntime().exec(" Rscript firstscript.r");
        System.out.println("Script executed");
         } catch (IOException ex) {
       System.out.println("Exception");
       System.out.println(ex.getMessage());
    }

}

好吧,我得到了“脚本执行”字样。

我的(好吧,不是我的,只是为了测试)r-Code非常简单,几乎只是看它的工作原理:

x=seq(0,2,by=0.01)
y=2*sin(2*pi*(x-1/4))
plot(x,y)

因此,除了绘制窦之外,它不应该做更多的事情。

但是,不应该有某种弹出窗口,你可以真正看到情节? 因为没有。我做错了什么?

编辑:为了回应我在这里发表的评论,我编辑了r文件,添加:

jpeg('rplot.jpg')
plot(x,y)
dev.off()

到它。

但是,如果我尝试在我的系统上找到rplot.jpg,那就不行了。

2 个答案:

答案 0 :(得分:2)

您将相对目录传递给jpeg函数。这使它相对于R的当前工作目录(getwd返回的值)。

尝试打印此值以查看其位置(在Windows上,默认情况下,它位于当前用户的“我的文档”中)

print(getwd())

或将绝对路径传递给jpeg

jpeg('c:/rplot.jpg')
plot(x,y)
dev.off()

要获取绝对路径,请使用pathological::standardize_pathR.utils::getAbsolutePath

答案 1 :(得分:1)

您可以等待Processexec返回Process个对象)完成 使用waitFor,并检查退出值:它应为0。

如果不为零,则可能需要指定脚本的路径。

public static void main( String[] args ) throws IOException, InterruptedException {
    Process p = Runtime.getRuntime().exec("Rscript /tmp/test.R");
    System.out.println("Started");
    p.waitFor();
    if( p.exitValue() != 0 )
        System.out.println("Something went wrong");
    else 
        System.out.println("Finished");
}

如果退出值不为0,则可以查看进程的stdout和stderr, 正如Andrew在评论中所建议的那样。

public static void main(String[] args) throws IOException, InterruptedException {
    System.out.println("test...");
    Process p = Runtime.getRuntime().exec(new String[] {
        "Rscript",
        "-e",
        "print(rnorm(5)))" // Intentional error, to produce an error message
    } );
    System.out.println("Started");

    String line = null;

    System.out.println("Stdout:");
    BufferedReader stdout = new BufferedReader( new InputStreamReader( p.getInputStream() ) );
    while ( (line = stdout.readLine()) != null)
        System.out.println(line);

    System.out.println("Stderr:");
    BufferedReader stderr = new BufferedReader( new InputStreamReader( p.getErrorStream() ) );
    while ( (line = stderr.readLine()) != null)
        System.out.println(line);

    p.waitFor();
    if( p.exitValue() != 0 )
        System.out.println("Something went wrong, exit value=" + p.exitValue());
    else 
        System.out.println("Finished");
}

如评论中所述, 你需要明确地打开设备。 由于脚本终止时它已关闭,因此您还需要添加延迟。

x11() # Open a device (also works on Windows)
plot( rnorm(10) )
Sys.sleep(10) # Wait 10 seconds