2013-11-26 49 views
0

我试图从Java启动R进程并重定向stdin和stdout。从java启动R进程

processBuilder = new ProcessBuilder().command("/usr/bin/R").redirectErrorStream(
      true); 
try { 
     Process p = processBuilder.start(); 
     OutputStream stdin = p.getOutputStream(); 
     InputStream stdout = p.getInputStream(); 

     BufferedReader reader = new BufferedReader (new InputStreamReader(stdout)); 
     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin)); 
     String line; 
     while ((line = reader.readLine()) != null) { 
      System.out.println ("Stdout: " + line); 
     } 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

我正在使用Java 1.6。当程序运行时,我得到以下错误:

标准输出:致命错误:你必须指定“--save”,“--no保存”或“--vanilla”

任何帮助将是不胜感激!谢谢!

+0

为与R的错误?问题是使用R和Java编程问题? – NormR

回答

2

你不能没有这些选项中的一个具有重定向标准输入运行R:

R < foo.R 
Fatal error: you must specify '--save', '--no-save' or '--vanilla' 

你想R键保存其工作数据时,其成品(--save)?还是不行(--no-save)?你可能会发现 - vanilla适合你的使用。

--vanilla 
      Combine --no-save, --no-restore, --no-site-file, --no-init-file and --no-environ 

我不太知道如何将参数传递到Java的ProcessBuilder的事情,但也许它只是:

processBuilder = new ProcessBuilder().command("/usr/bin/R --vanilla").redirectErrorStream(
      true); 

或者它有设定ARGS方法。

+0

Spacedman感谢您的答案,它做了诀窍......我没有意识到错误信息来自R进程。 – BigONotation

1

这里是如何将参数传递至R同时发动它作为一个子进程:

public void startR() { 
    List<String> commandAndParams = new ArrayList<String>(); 
    commandAndParams.add("/usr/bin/R"); 
    commandAndParams.add("--vanilla"); 
    processBuilder = new ProcessBuilder().command(commandAndParams).redirectErrorStream(
      true); 
    try { 
     Process p = processBuilder.start(); 
     OutputStream stdin = p.getOutputStream(); 
     InputStream stdout = p.getInputStream(); 

     BufferedReader reader = new BufferedReader (new InputStreamReader(stdout)); 
     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin)); 
     String line; 
     while ((line = reader.readLine()) != null) { 
      System.out.println ("Stdout: " + line); 
     } 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

从而导致在输出为:

Stdout: 
Stdout: R version 3.0.1 (2013-05-16) -- "Good Sport" 
Stdout: Copyright (C) 2013 The R Foundation for Statistical Computing 
Stdout: Platform: x86_64-apple-darwin10.8.0 (64-bit) 
Stdout: 
Stdout: R is free software and comes with ABSOLUTELY NO WARRANTY. 
Stdout: You are welcome to redistribute it under certain conditions. 
Stdout: Type 'license()' or 'licence()' for distribution details. 
Stdout: 
Stdout: Natural language support but running in an English locale 
Stdout: 
Stdout: R is a collaborative project with many contributors. 
Stdout: Type 'contributors()' for more information and 
Stdout: 'citation()' on how to cite R or R packages in publications. 
Stdout: 
Stdout: Type 'demo()' for some demos, 'help()' for on-line help, or 
Stdout: 'help.start()' for an HTML browser interface to help. 
Stdout: Type 'q()' to quit R. 
Stdout: