• Aucun résultat trouvé

∗ Utilisation des Interfaces Homme/Machine (IHM) de Java

N/A
N/A
Protected

Academic year: 2022

Partager "∗ Utilisation des Interfaces Homme/Machine (IHM) de Java "

Copied!
14
0
0

Texte intégral

(1)

rJava : utilisation parallèle et communication entre deux

langages informatiques

Julien Troudet

(2)

∗ rJava (Appel de Java dans un script R)

∗ Utilisation des Interfaces Homme/Machine (IHM) de Java

∗ Bibliothèques spécifiques à Java

∗ Parallélisation de certaines taches

∗ JRI (Appel de R dans un programme Java)

∗ Ajout de fonctionnalités statistiques dans une application Java

∗ Packages spécifiques à R

Pourquoi utiliser rJava (ou JRI) ?

(3)

install.packages('rJava')

Pour JRI il faut aussi ajouter aux variables

d’environnement les localisations des fichiers dll de R et rJava

Possibilité d’utiliser RJava Eclipse Plugin pour faciliter l’utilisation de R dans java

(http://www.studytrails.com/RJava-Eclipse-Plugin/)

Installation de rJava

(4)

library(rJava)

.jinit()

s <- .jnew("java/lang/String", "Hello World!")

.jcall(s,"I","indexOf","World")

[1] 6

Appeler Java depuis R

Objet java

Type de retour (Integer)

Méthode

Paramètre(s) démarre la JVM

nouvel objet java (String) appel à la méthode indexOf de l’objet s Passage d’instructions basiques à la

Java Virtual Machine (JVM)

(5)

Affichage d’une fenêtre utilisant les composants awt de java (IHM)

f <- .jnew("java/awt/Frame", "Hello")

b <- .jnew("java/awt/Button", "OK")

.jcall(f, "Ljava/awt/Component;", "add", .jcast(b, "java/awt/Component"))

.jcall(f,, "pack")

.jcall(f,, "setVisible", TRUE)

.jcall(f,, "setSize", as.integer(200), as.integer(200))

Appeler Java depuis R

(6)

helloJavaWorld - inst

- doc

- helloJavaWorld.Rnw - java

- hellojavaworld.jar - java

- HelloJavaWorld.java - man

- helloJavaWorld.Rd - R

- helloJavaWorld.R - onLoad.R

- DESCRIPTION - NAMESPACE

Créer un package R utilisant Java

public class HelloJavaWorld { public String sayHello() {

String result = new String("Hello Java World!");

return result;

}

public static void main(String[] args) { } }

helloJavaWorld <- function(){

hjw <- .jnew("HelloJavaWorld")

out <- .jcall(hjw, "S", "sayHello") return(out)

}

.onLoad <- function(libname, pkgname) { .jpackage(pkgname, lib.loc = libname) }

(7)

Rengine rengine = new Rengine(new String[]{"--vanilla"}, false, null);

int y = 15;

rengine.assign("y", y);

rengine.eval("yArray <- c(1:reponse)");

double[] yArray = rengine.eval("yArray").asDoubleArray();

System.out.println(yArray);

[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]

Appeler R depuis Java

un entier Java

Assignation de y à une variable du même nom dans R

Instruction passée à R

Récupération de la valeur d’une variable R nouvelle instance de R

Passage d’instructions basiques à R

(8)

Rengine rengine = new Rengine(new String[]{"--vanilla"}, false, null);

//création d’un objet fichier qui pointe vers un script R

File scriptFile = new File("ressources"+File.separator+"script.R");

//modification du chemin (Windows)

String pathForR = scriptFile.getAbsolutePath().replace("\\", "\\\\")

int y = 15;

rengine.assign("y", y);

rengine.eval(String.format("source('%s')", pathForR));

double[] yArray = rengine.eval("yArray").asDoubleArray();

Appeler R depuis Java

Utilisation d’un fichier de scripts

(9)

Multithreading

Java

Thread 1

Thread 2

Thread 3

Thread 4

R

Java

Thread 1

Thread 2

Thread 3

Thread 4

R n’est pas conçu pour utiliser plusieurs processeurs, et

implémenter cette

fonctionnalité peut être

compliqué ou impossible selon les cas.

Java est facile à paralléliser et est capable de faire interagir de multiples threads avec une instance unique de R.

(10)

public void searchForOutliers() {

int nThreads = Runtime.getRuntime().availableProcessors();

ExecutorService executorService = new ThreadPoolExecutor(

nThreads, // nombre de thread minimal nThreads*2, // nombre max de threads 1,

TimeUnit.MINUTES,

new ArrayBlockingQueue<Runnable>(nThreads, true), new ThreadPoolExecutor.CallerRunsPolicy()

);

for(Species species : listSp){//boucle sur la liste d’espèces executorService.execute(new ProcessusGeoOutliers(species));

}

executorService.shutdown();

try {

executorService.awaitTermination(3600, TimeUnit.SECONDS);

} catch (InterruptedException e) { e.printStackTrace();

} }

Multithreading

Création du pool de threads à utiliser et boucle du processus pour détecter les outliers

géographiques de chaque espèce.

(11)

private Species species;

private int xEckert, yEckert;

public ProcessusGeoOutliers(Species species) { super();

this.species = species;

this.xEckert = getXEckert(species);

this.yEckert = getYEckert(species);

}

@Override

public void run() {

double[] outliers = RScriptExecutor.getGeographicOutliers(xEckert, yEckert);

this.species.setOutliers = outliers;

} }

Multithreading

Le processus lance

automatiquement la méthode run() à chaque nouvelle

instance.

Cette méthode fait appel à une fonction utilisant R

(12)

public synchronized static double[] getGeographicOutliers(double[] xEckert, double[] yEckert) {

rengine.assign("xEckert", xEckert);

rengine.assign("yEckert", yEckert);

//read the R file

rengine.eval(String.format("source('%s')", scriptFilePath);

double[] isOutlier = rengine.eval("outlier").asDoubleArray();

rengine.eval("rm(list=ls(all=TRUE))");

return isOutlier;

}

Multithreading

La fonction utilise le mot clé

« synchronized » ce qui interdit l’utilisation simultanée de

cette méthode dans plusieurs threads.

(13)

Données après traitement:

12 classes

33 millions d’occurrences distinctes spatialement

Plus de 100 000 espèces

Mean number of species / 100 km²

Traitement de 650 millions

d’occurrences

(14)

∗ Hello Java World! A Tutorial for Interfacing to Java Archives inside R Packages. Tobias Verbeke 2014-09-03

∗ Rserve Serveur TCP/IP qui permet de faire interagir des programmes avec un « serveur » R.

Aller plus loin

Références

Documents relatifs

Comme le thread par défaut et en tête de liste des threads de plus haute priorité, il devient le thread actif courant et la liste de priorite 5 devient.. Priorité 5 : calcThread

Remarquez que ce schéma exprime qu'un JMenu est un JMenuItem : lorsqu'un menu est employé en tant qu'item, il a le comportement d'un sous-menu.. 2) Modifier l'exemple précédent

Elle contient des signatures de fonctions (comme les fonctions abstraites d’une classe abstraite). Pas de code (&lt;Java 1.8) Pas d’attribut (&lt;Java 1.8) Toutes les fonctions

PyQt peut générer du code python depuis Qt Designer Possibilité d’ajouter des widgets écrits en PyQt à Qt Designer L’interface graphique générée est une classe à importée...

La méthode addTab permet d’ajouter un composant dans une nouvelle feuille. Généralement on utilise un JPanel. L’onglet affiché peut être modifié à l’aide de

– Chargeur, éditeur de liens, Initialisation de la machine – Création, affectation des champs d'instances ou de classe – Segment d'activation, méthodes statiques et virtuelles,

Réaliser une horloge analogue à la précédente, mais avec un affichage graphique de secteurs circulaires bleu pour les secondes, rouge pour les minutes et jaune pour les heures.

Il y aura donc deux activités (threads) de remplissage : l’une d’entre elles remplit avec des balles rouges et l’autre remplit avec des boules vertes.. les balles seront placées