我试图从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,那就不行了。
答案 0 :(得分:2)
您将相对目录传递给jpeg
函数。这使它相对于R的当前工作目录(getwd
返回的值)。
尝试打印此值以查看其位置(在Windows上,默认情况下,它位于当前用户的“我的文档”中)
print(getwd())
或将绝对路径传递给jpeg
。
jpeg('c:/rplot.jpg')
plot(x,y)
dev.off()
要获取绝对路径,请使用pathological::standardize_path
或R.utils::getAbsolutePath
。
答案 1 :(得分: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,则可以查看进程的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