2017-06-06 273 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)。

希望這有助於。