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

使用Eclipse和Rserve从Java调用R的简单程序,java,eclipse,r,rserve,Java,Eclipse,R,Rserve,我的应用程序必须执行R操作,例如: m = matrix(sample(0:1,100, rep=T),ncol=10) 结果应该可用于Java应用程序 由于它充当TCP/IP服务器,因此桥接器可以连接到其他语言。我读过这个网站,但不知道如何制作可以使用Rserve的最简单的应用程序 制作一个简单的Eclipse应用程序,使用Rserve从Java执行R命令需要哪些步骤?快速步骤,尝试分离任务: Rserve可以自行安装。从那里开始 Rserve提供了示例客户机。尝试使用Java示例来工作 从

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

m = matrix(sample(0:1,100, rep=T),ncol=10)
结果应该可用于Java应用程序

由于它充当TCP/IP服务器,因此桥接器可以连接到其他语言。我读过这个网站,但不知道如何制作可以使用Rserve的最简单的应用程序


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

快速步骤,尝试分离任务:

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

  • Rserve提供了示例客户机。尝试使用Java示例来工作

  • 从这里开始,编写新程序

  • Eclipse是完全可选的。你不必使用它。如果这是学习的一个步骤,考虑跳过它。一旦1到3很好,学习如何在Eclipse中表达构建依赖关系


  • 下载部分有一个二进制版本的Rserve(www.rforge.net/Rserve/files/我有版本R2.13和Windows xp,所以我需要下载Windows二进制:Rserve_0.6-8.zip(541.3kb,更新:Wed Apr 18 07:00:45 2012))。将文件复制到包含R.DLL的目录。安装后,从起重机上恢复

    install.packages("Rserve")
    
    在R中(我有RStudio-方便的东西:)。 已从R中启动Rserve,只需键入

    library(Rserve)
    Rserve()
    
    С应运行任务管理器中的检查-Rserve.exe。 在Eclipse中创建Java项目后,在该项目下创建一个名为lib的目录。粘贴 这里有2个jar rservengine.jar和REngine.jar(www.rforge.net/Rserve/files/)。不要忘记在java项目中添加这个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
            }       
    
        }
    }
    

    从Java调用R有两种方法——JRI和RServe。是一个插件,可以帮助您在windows上安装RJava。如果您正在寻找更高生产级别的解决方案,那么Rserve将提供更好的用途。示例显示如何运行示例RServe程序。如果您使用的是RServe,则在eval函数中运行命令

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

    有一些默认数据结构可用于转换m(REXP)。

    以下是一些更详细的说明,用于从头创建RServe项目:

    首先在R中安装并运行Rserve。
  • 安装R
  • 从CRAN添加包R服务
  • 在R类型中:install.packages(“Rserve”)
  • 对于远程访问:

    • 创建文件:/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的一个实例现在正在本地主机端口6311上运行

    接下来创建一个Rserve项目(我正在使用eclipse) 为此,我将使用eclipse:

  • 从下载rservengine.jar和REngine.jar
  • 在eclipse中创建java项目
  • 在项目目录下创建一个lib文件夹。(与src文件夹的级别相同)
  • 将rservengine.jar和REngine.jar复制到lib文件夹中
  • 将JAR添加到生成路径:
  • 先添加一个包,然后再添加一个主类:将其称为HelloWorldApp
  • 将此代码添加到类中

    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");
        }
    
    }
    
    package com.sti.ai;
    导入java.io.BufferedReader;
    导入java.io.File;
    导入java.io.FileNotFoundException;
    导入java.io.FileReader;
    导入java.io.IOException;
    导入org.rosuda.REngine.REXP;
    导入org.rosuda.REngine.REXPMismatchException;
    导入org.rosuda.REngine.Rserve.r连接;
    导入org.rosuda.REngine.Rserve.RserveException;
    公共类HelloWorldApp{
    publicstaticvoidmain(字符串[]args)抛出RserveException、rexpmismatcheException、FileNotFoundException、IOException{
    RConnection c=新的RConnection(“,6311”);
    如果(c.断开连接()){
    System.out.println(“连接到RServe”);
    if(c.needLogin()){
    System.out.println(“提供登录”);
    c、 登录(“用户名”、“密码”);
    }
    rexpx;
    System.out.println(“读取脚本…”);
    文件文件=新文件(“”);
    try(BufferedReader br=new BufferedReader(new FileReader(file))){
    for(字符串行;(line=br.readLine())!=null;){
    系统输出打印项次(行);
    x=c.eval(line);//计算R中的行
    System.out.println(x);//打印结果
    }
    }
    }否则{
    System.out.println(“Rserve无法连接”);
    }
    c、 close();
    System.out.println(“会话关闭”);
    }
    }
    
    最后,运行HelloWorldApp.java

    对于使用Maven的用户

    
    org.nuiton.thirdparty
    

    
    org.rosuda.REngine
    R服务
    1.8.1
    
    我的问题是如何让java客户端工作,到底应该做什么?请假定我不知道
    <dependency>
        <groupId>org.nuiton.thirdparty</groupId>
        <artifactId>REngine</artifactId>
        <version>1.7-3</version>
    </dependency>
    
    <dependency>
        <groupId>org.rosuda.REngine</groupId>
        <artifactId>Rserve</artifactId>
        <version>1.8.1</version>
    </dependency>