繁体   English   中英

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

[英]Simple program to call R from Java using Eclipse and Rserve

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

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

结果应可用于Java应用程序。

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

制作使用Rserve从Java执行R命令的简单Eclipse应用程序需要什么步骤?

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

install.packages("Rserve")

在R中(我有RStudio-方便的东西: 下载RStudio IDE )。 从R内部启动Rserve,只需键入

library(Rserve)
Rserve()

请在任务管理器中运行-Rserve.exe。 在Eclipse中创建Java项目后,在该项目下创建一个名为lib的目录。 将2个jar粘贴到RserveEngine.jar和REngine.jar(www.rforge.net/Rserve/files/)。 不要忘记在Java项目的Properties中添加此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
        }       

    }
}

以下是一些有关从头开始创建RServe项目的详细说明:

首先安装并在R中运行Rserve。

  1. 安装R
  2. 从CRAN添加软件包RServe。
  3. 在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上运行。

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

为此,我将使用eclipse:

  1. 此处下载RserveEngine.jar和REngine.jar。
  2. 在eclipse中创建一个Java项目。
  3. 在项目目录下创建一个lib文件夹。 (与您的src文件夹相同)
  4. 将RserveEngine.jar和REngine.jar复制到lib文件夹中。
  5. 添加罐子以构建路径: 说明
  6. 添加一个包,然后添加一个主类:将其称为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");
    }

}

最后,运行HelloWorldApp.java

对于那些正在使用Maven的人

引擎

<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>

快速的,尝试分离任务:

  1. Rserve可以单独安装。 从那里开始。

  2. Rserve有示例客户端。 尝试Java示例工作。

  3. 从那里,编写新程序。

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

从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)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM