2017-06-06 171 views
0

我需要为每次运行使用不同的参数反复运行相同的R脚本。我写了R部分,它的工作原理。我正在尝试将这个过程与我写过的其他一些Java工具集成在一起,这些工具将需要在R脚本更改的文件上使用。因此我试图从Java运行我的R文件。我尝试使用命令行提示符运行它:RScript TestR.R(此命令在终端中工作),但没有奏效。因此,我正在尝试从bash文件运行我的R脚本。我使用和上面相同的命令,我的bash文件可以执行其他命令,但是由于某种原因,当我尝试运行R文件时没有任何反应。我正在使用的java命令是从bash脚本执行R文件

Process proc = Runtime.getRuntime().exec("absolute-path/testbash.sh"); 

我不确定要查找的输出格式是什么。目前,这运行没有任何运行时错误。

更新:当我检查了ErrorStream,故称"Rscript: command not found"

更新:我想通了,通过使用"/usr/local/bin/RScript"为命令

+0

尝试放置.sh脚本的绝对路径?另外,如果“exec()”不成功,Process应该保持一些状态。 –

+0

您是否尝试过其他示例之一:例如[:https://stackoverflow.com/questions/3468987/executing-another-application-from-java]。 – morecore

+0

Agastya,你的问题没有格式化得很好,你能花更多时间来组织这个问题吗?让我们更好地了解事物的发展方向等。 – alexmherrmann

回答

0

你可以做到这一点通过以下方式:

new ProcessBuilder("<absolute-path-to-script>/testbash.sh").start(); 
0

使用简单的R代码,我发现从Java终端中的终端调用RScript更容易,并且解析R代码的输出。如果您以简单解析的格式打印您想要的任何信息,这可以很好地工作。

例如,我将在Java中

private ArrayList<String> runCommand(String command) 
{ 
    try 
    { 
     Runtime rt = Runtime.getRuntime(); 
     Process proc = rt.exec(command); 

     BufferedReader stdInput = new BufferedReader(
      new InputStreamReader(proc.getInputStream())); 

     String lastReadLine = null; 
     ArrayList<String> output = new ArrayList<>(); 
     while((lastReadLine = stdInput.readLine()) != null) 
      output.add(lastReadLine); 
     return output; 
    } 
    catch(Exception ex) { throw new RuntimeException("[RunCommand]: Exception when trying to execute command: " + ex.getMessage()); } 
} 

调用一个函数,像这样用参数\pathTo\RScript \pathTo\MyRCode.R并解析所得到的ArrayList<String>在Java中,以获得将R代码产生的任何信息。

还有其他方法可以做到这一点。您可能会从R代码中写出一些JSON文件,并在R代码输出中返回此路径,然后Java可以解析并读取此文件。或者你可以使用其中的一个R-Java互操作库(就是google)。

希望这有助于。