【问题标题】:Invoke R Language/script from java从 java 调用 R 语言/脚本
【发布时间】:2012-05-29 14:29:50
【问题描述】:

我们如何从java调用R语言/R脚本?基本上我需要围绕 R 脚本的 java 类型的包装器。

  1. 数据将被提供给 java 层,比如 setData(double[]) 方法,该方法又应该发送给 R 脚本 - 让我们说 setDataR(double []) 方法。

  2. R 脚本将执行一些计算,比如调用方法 double[] computeR()。

  3. Java 程序将通过调用 double[] getData() 来获取计算结果,而后者又委托给 R 脚本来获取计算数据。

JRI、Rserv、Rcaller 如何执行此操作?我没有看到任何调用 Rscript 方法的方法?请寄样品。它应该类似于 JNI (java, C++) 调用。

  1. 在 jvm 中我认为多个线程不能正确调用 R 脚本调用吗?有什么解决办法吗?

谢谢

【问题讨论】:

    标签: java r rserve jri rcaller


    【解决方案1】:

    在 Java 中使用 R 的最简单方法是使用 Runtime.exec(""),获取响应并解析它。如何运行本机指令的典型示例是:

    Process p = Runtime.getRuntime().exec("ls");
    BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
    BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
    

    从这里,您可以读取和处理打印到标准输出并缓冲到stdInput 的结果。

    【讨论】:

    • 此操作需要额外的字符串解析过程,已经由 RCaller 处理。
    【解决方案2】:

    RCaller 完全符合您的要求。假设您有一个定义为

    的双数组'a'
    double[] a = new double[] {1.0, 2.0, 3.0};
    

    并且您想要计算平均值、中位数和标准差值。创建一个新的 RCaller 实例

    RCaller caller = new RCaller();
    Globals.detect_current_rscript();
    caller.setRscriptExecutable(Globals.Rscript_current);
    
    RCode code = new RCode();
    
    
    code.addDoubleMatrix("a", a);
    code.addRCode("s <- list(mean=mean(a), median=median(a), sd=sd(a))");
    
    caller.setRCode(code);
    
    caller.runAndReturnResult("s");
    
    double mean = caller.getParser().getAsDoubleArray("mean")[0];
    double median = caller.getParser().getAsDoubleArray("median")[0];
    double sd = caller.getParser().getAsDoubleArray("sd")[0];
    

    并且变量中位数保存从 R 脚本返回的值 2.0。详情请访问页面here

    【讨论】:

      猜你喜欢
      • 2012-02-09
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 2010-11-12
      • 2012-11-24
      • 2011-04-20
      • 2011-06-28
      相关资源
      最近更新 更多