使用Eclipse和Rserve从Java调用R的简单程序

时间:2012-04-18 18:53:39

标签: java eclipse r rserve

我的应用程序必须执行R操作,例如:

m = matrix(sample(0:1,100, rep=T),ncol=10)

结果应该可供Java应用程序使用。

Rserve package将R桥接到其他语言,因为它充当TCP / IP服务器。我已阅读该网站,但不知道如何制作可以使用Rserve的最简单的应用程序。

使用Rserve从Java执行R命令的简单Eclipse应用程序需要哪些步骤?

4 个答案:

答案 0 :(得分:21)

下载部分有一个二进制版本的Rserve(www.rforge.net/Rserve/files/我有版本R 2.13和Windows xp,所以我需要下载Windows二进制文件:Rserve_0.6-8.zip(541.3) kb,更新时间:2012年4月18日星期三07:00:45))。将文件复制到包含R.DLL的目录。从CRAN安装Rserve后

install.packages("Rserve")
R中的

(我有RStudio - 方便的事情:Download RStudio IDE)。 开始Rserve来自R,只需输入

library(Rserve)
Rserve()

在任务管理器中检查 - 应该运行Rserve.exe。 在Eclipse中创建Java项目之后,在该项目下创建一个名为lib的目录。糊 这里有2个罐子RserveEngine.jar和REngine.jar(www.rforge.net/Rserve/files/)。不要忘记在属性java-project中添加这个jar。在新的类代码中:

import org.rosuda.REngine.*;
import org.rosuda.REngine.Rserve.*;

public class rserveuseClass {
    public static void main(String[] args) throws RserveException {
        try {
            RConnection c = new RConnection();// make a new local connection on default port (6311)
            double d[] = c.eval("rnorm(10)").asDoubles();
            org.rosuda.REngine.REXP x0 = c.eval("R.version.string");
            System.out.println(x0.asString());
} catch (REngineException e) {
            //manipulation
        }       

    }
}

答案 1 :(得分:14)

以下是从头开始创建RServe项目的更详细说明:

首先安装并让Rserve在R。

中运行
  1. 安装R
  2. 从CRAN添加包RServe。
  3. 在R类型:install.packages(“Rserve”)
  4. 对于远程访问:

    • 创建文件:/etc/Rserv.conf

    将以下内容添加到Rserv.conf

    workdir /tmp/Rserv
    remote enable
    auth required
    plaintext disable
    port 6311
    maxsendbuf 0 (size in kB, 0 means unlimited use)
    

    在R中:运行以下命令

    library(Rserve)
    

    对于Windows:

    Rserve()
    

    对于Mac:

    Rserve(args="--no-save")
    

    Rserve的一个实例现在在localhost端口6311上运行。

    下一步创建一个Rserve项目(我正在使用eclipse)

    为此,我将使用eclipse:

    1. here下载RserveEngine.jar和REngine.jar。
    2. 在eclipse中创建一个java项目。
    3. 在项目目录下创建一个lib文件夹。 (与您的src文件夹相同)
    4. 将RserveEngine.jar和REngine.jar复制到lib文件夹中。
    5. 添加jar以构建路径:Instructions
    6. 添加一个包然后添加一个主类:称之为HelloWorldApp。
    7. 将此代码添加到班级

      package com.sti.ai;
      
      import java.io.BufferedReader;
      import java.io.File;
      import java.io.FileNotFoundException;
      import java.io.FileReader;
      import java.io.IOException;
      
      import org.rosuda.REngine.REXP;
      import org.rosuda.REngine.REXPMismatchException;
      import org.rosuda.REngine.Rserve.RConnection;
      import org.rosuda.REngine.Rserve.RserveException;
      
      public class HelloWorldApp {
      
          public static void main(String[] args) throws RserveException, REXPMismatchException, FileNotFoundException, IOException {
              RConnection c = new RConnection("<host/ip>", 6311);
              if(c.isConnected()) {
                  System.out.println("Connected to RServe.");
                  if(c.needLogin()) {
                      System.out.println("Providing Login");
                      c.login("username", "password");
                  }
      
                  REXP x;
                  System.out.println("Reading script...");
                  File file = new File("<file location>");
                  try(BufferedReader br = new BufferedReader(new FileReader(file))) {
                      for(String line; (line = br.readLine()) != null; ) {
                          System.out.println(line);
                          x = c.eval(line);         // evaluates line in R
                          System.out.println(x);    // prints result
                      }
                  }
      
              } else {
                  System.out.println("Rserve could not connect");
              }
      
              c.close();
              System.out.println("Session Closed");
          }
      
      }
      

      最后,运行HelloWorldApp.java

      对于那些使用Maven的人

      REngine

      <dependency>
          <groupId>org.nuiton.thirdparty</groupId>
          <artifactId>REngine</artifactId>
          <version>1.7-3</version>
      </dependency>
      

      RServe

      <dependency>
          <groupId>org.rosuda.REngine</groupId>
          <artifactId>Rserve</artifactId>
          <version>1.8.1</version>
      </dependency>
      

答案 2 :(得分:3)

快速尝试分开任务:

  1. Rserve可以自行安装。从那里开始。

  2. Rserve有示例客户端。尝试使用Java示例。

  3. 从那里开始编写新程序。

  4. Eclipse完全是可选的。你不必使用它。如果这是学习的又一步,请考虑跳过它。一旦1到3就可以了,学习如何在Eclipse中表达构建依赖关系。

答案 3 :(得分:2)

有两种方法可以从Java调用R - JRI和RServe。 This是一个插件,可以帮助您在Windows上设置RJava。如果您正在寻找更具生产力的解决方案,那么Rserve可以提供更好的服务。 This示例显示了如何运行示例RServe程序。如果您使用的是RServe,则在eval函数中运行命令

REXP m = c.eval("matrix(sample(0:1,100, rep=T),ncol=10)")

您可以使用一些默认数据结构来转换m(REXP)。