2

我正在尝试从 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,它根本就不存在。

4

2 回答 2

2

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

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

print(getwd())

或将绝对路径传递给jpeg.

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

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

于 2013-09-02T14:22:09.553 回答
1

您可以等待Process(exec返回一个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,您可以按照 Andrew 的评论中的建议查看进程的 stdout 和 stderr。

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
于 2013-09-02T14:21:02.810 回答