web-dev-qa-db-fra.com

Programme simple pour appeler R depuis Java utilisant Eclipse et Rserve

Mon application doit effectuer des opérations R telles que:

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

Les résultats devraient être disponibles pour une application Java.

Le package Rserve relie R à d'autres langues, car il agit comme un serveur TCP/IP. J'ai lu le site Web, mais je ne sais pas comment créer l'application la plus simple pouvant utiliser Rserve.

Quelles étapes sont nécessaires pour créer une application Eclipse simple qui utilise Rserve pour exécuter des commandes R à partir de Java?

22
Musmar

Il existe une version binaire de Rserve dans la section de téléchargement (www.rforge.net/Rserve/files/ J'ai la version R 2.13 et Windows xp, j'ai donc besoin de télécharger le binaire Windows: Rserve_0.6-8.Zip (541.3kb, mis à jour : Mer.18 avril 07:00:45 2012)). Copiez le fichier dans le répertoire contenant R.DLL. Après avoir installé Rserve de CRAN

install.packages("Rserve")

en R (j'ai RStudio - chose pratique: Télécharger RStudio IDE ). commencé Rserve est à partir de R, tapez simplement

library(Rserve)
Rserve()

Vérifiez dans le Gestionnaire des tâches - Rserve.exe doit être exécuté. Après avoir créé un Java dans Eclipse, créez un répertoire appelé lib sous ce projet. Collez 2 pots ici RserveEngine.jar et REngine.jar (www.rforge.net/Rserve/files/). N'oubliez pas d'ajouter ces jars dans les propriétés de votre projet Java. Dans le nouveau code de classe:

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
        }       

    }
}
21
Alina

Voici quelques instructions plus détaillées pour créer un projet RServe à partir de zéro:

Installez d'abord et lancez Rserve dans R.

  1. Installer R
  2. Ajoutez le package RServe de CRAN.
  3. Dans R, tapez: install.packages ("Rserve")

Pour l'accès à distance:

  • Créer un fichier: /etc/Rserv.conf

Ajoutez ce qui suit à Rserv.conf

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

Dans R: exécutez les commandes suivantes

library(Rserve)

Pour les fenêtres:

Rserve()

Pour Mac:

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

Une instance de Rserve s'exécute maintenant sur le port localhost 6311.

Créez ensuite un projet Rserve (j'utilise Eclipse)

Pour cela, je vais utiliser Eclipse:

  1. Téléchargez RserveEngine.jar et REngine.jar depuis ici .
  2. Créez un projet Java dans Eclipse.
  3. Créez un dossier lib sous votre répertoire de projet. (même niveau que votre dossier src)
  4. Copiez RserveEngine.jar et REngine.jar dans le dossier lib.
  5. Ajouter des bocaux pour construire le chemin: Instructions
  6. Ajoutez un package puis une classe principale: appelez-le quelque chose comme HelloWorldApp.

Ajoutez ce code à la classe

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");
    }

}

Enfin, exécutez HelloWorldApp.Java

Pour ceux qui utilisent 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>
14
Wiggitamoo

Rapides, en essayant de séparer les tâches:

  1. Rserve peut être installé seul. Commencez par là.

  2. Rserve a des exemples de clients. Essayez les exemples Java Java pour travailler.

  3. De là, écrivez votre nouveau programme.

  4. Eclipse est entièrement facultatif. Vous n'êtes pas obligé de l'utiliser. Si c'est une étape de plus à apprendre, pensez à la sauter. Une fois que 1 à 3 sont corrects, découvrez comment exprimer les dépendances de génération dans Eclipse.

3
Dirk Eddelbuettel

Il y a deux façons d'appeler R à partir de Java - JRI et RServe. This est un plugin qui vous aidera à configurer RJava sur Windows. Si vous cherchez un plus solution au niveau de la production, alors Rserve sert un meilleur but. Cet exemple montre comment exécuter un exemple de programme RServe. Si vous utilisez RServe, exécutez votre commande dans la fonction eval

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

Il existe des infrastructures de données par défaut que vous pouvez utiliser pour convertir m (REXP).

2
mithil-studytrails