Проста програма за извикване на R от Java с помощта на Eclipse и Rserve

Моето приложение трябва да изпълнява R операции като:

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

Резултатите трябва да са достъпни за Java приложение.

Пакетът Rserve свързва R с други езици, тъй като действа като TCP/IP сървър. Прочетох уебсайта, но не знам как да направя най-простото приложение, което може да използва Rserve.

Какви стъпки са необходими, за да се направи просто приложение на Eclipse, което използва Rserve за изпълнение на R команди от Java?


person Musmar    schedule 18.04.2012    source източник


Отговори (4)


Има двоична версия на Rserve в раздела за изтегляне (www.rforge.net/Rserve/files/ Имам версия R 2.13 и Windows xp, така че трябва да изтегля Windows двоичен файл: Rserve_0.6-8.zip (541.3kb, актуализиран : сряда, 18 април 07:00:45 2012)). Копирайте файла в директорията, съдържаща R.DLL. След инсталиране на Rserve от CRAN

install.packages("Rserve")

в R (имам RStudio - удобно нещо: Изтеглете RStudio IDE). стартираният Rserve е от R, просто въведете

library(Rserve)
Rserve()

Проверете в Task Manager - Rserve.exe трябва да се стартира. След като направите Java проект в Eclipse, направете директория, наречена lib, под този проект. Поставете 2 буркана тук RserveEngine.jar и REngine.jar (www.rforge.net/Rserve/files/). Не забравяйте да добавите тези буркани в свойствата на вашия java-проект. В нов код на клас:

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
        }       

    }
}
person Alina    schedule 19.04.2012

Ето някои по-подробни инструкции за създаване на RServe проект от нулата:

Първо инсталирайте и стартирайте Rserve в R.

  1. Инсталирайте R
  2. Добавете пакет RServe от CRAN.
  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.

Следващ Създайте Rserve проект (използвам eclipse)

За това ще използвам eclipse:

  1. Изтеглете RserveEngine.jar и REngine.jar от тук.
  2. Създайте java проект в eclipse.
  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

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>
person Wiggitamoo    schedule 03.03.2014

Бързи, опитващи се да разделят задачите:

  1. Rserve може да се инсталира сам. Започнете оттам.

  2. Rserve има примерни клиенти. Опитайте примерите на Java да работят.

  3. Оттам напишете новата си програма.

  4. Eclipse е напълно незадължителен. Не е нужно да го използвате. Ако това е още една стъпка за учене, помислете дали да не я пропуснете. След като 1 до 3 са наред, научете как да изразявате зависимости на изграждането в Eclipse.

person Dirk Eddelbuettel    schedule 18.04.2012
comment
Проблемът ми е да накарам Java клиентите да работят, какво точно трябва да се направи? моля, приемете, че не знам - person Musmar; 19.04.2012

Има два начина за извикване на R от Java - JRI и RServe. Това е плъгин, който ще ви помогне да настроите RJava на Windows. Ако търсите решение на по-производително ниво, тогава Rserve служи за по-добра цел. Този пример показва как да стартирате примерна програма RServe. Ако използвате RServe, изпълнете командата си във функцията eval

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

Има някои структури от данни по подразбиране, които можете да използвате за конвертиране на m (REXP).

person mithil-studytrails    schedule 29.06.2013