Exécuter R à partir de Java Je veux exécuter rJava

introduction

Il y a environ six mois, un nouveau venu a dit: «Je veux exécuter R à partir de Java», et j'ai écrit une note lorsque j'ai répondu. C'était correct de lancer le processus, mais il y avait un module appelé ** JRI ** appelé ** Java / R Interface **, alors j'ai décidé de m'en occuper.

What is rJava?

rJava is a simple R-to-Java interface.
It is comparable to the .C/.Call C interface.
rJava provides a low-level bridge between R and Java (via JNI).
It allows to create objects, call methods and access fields of Java objects from R.

http://www.rforge.net/rJava/index.html

En bref, c'est une interface qui appelle R via JNI. Depuis que JNI est utilisé, la configuration du fichier dll était un peu gênante.

Obtenez JRI.jar

Je vais laisser tomber JRI.jar.

Démarrez l'interface graphique R et exécutez la commande d'installation.

install.packages('rJava')

Cela téléchargera le JAR et la DLL sous C: \ Program Files \ R \ R-3.3.1 \ library \ rJava \. Il semble que la gestion des versions JAR devient soudainement chaotique. Seul JRI.jar semble être capable de gérer le référentiel.

Cliquez ici pour utiliser Gradle.

// https://mvnrepository.com/artifact/org.nuiton.thirdparty/JRI
compile group: 'org.nuiton.thirdparty', name: 'JRI', version: '0.9-6'

Cliquez ici pour utiliser Maven.

<dependency>
	<groupId>org.nuiton.thirdparty</groupId>
	<artifactId>JRI</artifactId>
	<version>0.9-6</version>
</dependency>

… Mais j'ai absolument besoin du fichier dll inclus dans rJava. Il semble qu'il soit nécessaire de prendre des mesures individuelles telles que le supprimer du site d'origine sans appuyer sur la commande. http://www.rforge.net/rJava/files/

paramètres dll

Obtenez jri.dll et définissez-le. Un des fichiers C: \ Program Files \ R \ R-3.3.1 \ library \ rJava \ jri.

64 bits est «x64», 32 bits est «i386».

Cette fois, je l'ai déployé dans le dossier directement sous l'exécution. Si vous souhaitez le déployer dans un dossier différent, vous devez le mettre dans votre PATH.

Comment exécuter dans une application autonome

Vous devez le faire via votre PATH.

Comment exécuter l'environnement Windows


set PATH=%PATH%;C:/Program Files/R/R-3.3.1/bin;C:/Program Files/R/R-3.3.1/bin/i386;C:\Program Files\R\R-3.3.1\library\rJava\jri\i386

java ^
-classpath "./classes;C:/Program Files/R/R-3.3.1/library/rJava/jri/JRI.jar" ^
example.MyTest

Cela a fonctionné sans les paramètres ci-dessous.

Paramètres inutiles?


set R_DOC_DIR="C:/Program Files/R/R-3.3.1/doc"
set R_INCLUDE_DIR="C:/Program Files/R/R-3.3.1/include"
set R_SHARE_DIR="C:/Program Files/R/R-3.3.1/share"

Méthode d'exécution lors de l'exécution avec une application serveur

Ajoutez JRI.jar à WEB-INF / lib (non requis s'il est géré par Maven ou Gradle).

Vous devez également définir le chemin d'accès à jri.dll. Bouton d'exécution vert> Exécuter la configuration> Arguments> Arguments VM

Arguments d'exécution


-Djava.library.path="C:\Program Files\R\R-3.3.1\library\rJava\jri\i386"

Ajouter

Erreurs courantes

Oubliez de passer le chemin de jri.dll

J'obtiens souvent cette erreur.

Cannot find JRI native library!
Please make sure that the JRI native library is in a directory listed in java.library.path.

java.lang.UnsatisfiedLinkError: no jri in java.library.path
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1864)
	at java.lang.Runtime.loadLibrary0(Runtime.java:870)
	at java.lang.System.loadLibrary(System.java:1122)
	at org.rosuda.JRI.Rengine.<clinit>(Rengine.java:19)
	at example.MyTest(MyTest.java:11)

N'oubliez pas de définir le chemin de jri.dll.

Mettez-vous en colère si vous ne passez pas une variable par le chemin R

Si vous franchissez ce qui précède, ce qui suit apparaîtra.

Cannot find JRI native library!
Please make sure that the JRI native library is in a directory listed in java.library.path.

java.lang.UnsatisfiedLinkError: C:\dll\jri.dll: Can't find dependent libraries
	at java.lang.ClassLoader$NativeLibrary.load(Native Method)
	at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1938)
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1854)
	at java.lang.Runtime.loadLibrary0(Runtime.java:870)
	at java.lang.System.loadLibrary(System.java:1122)
	at org.rosuda.JRI.Rengine.<clinit>(Rengine.java:19)
	at example.MyTest(MyTest.java:11)

Même s'il est défini, je me fâche lorsque la dépendance de dll est étrange. Puisque jri.dll dépend de dll sous bin / i386 ou bin / x86, n'oubliez pas de le définir également.

Résumé

Recommended Posts

Exécuter R à partir de Java Je veux exécuter rJava
Je veux écrire rapidement de java vers sqlite
[Java] Je souhaite calculer la différence par rapport à la date
Je veux arrêter complètement les mises à jour Java
Changements de Java 8 à Java 11
Somme de Java_1 à 100
Je souhaite envoyer un e-mail en Java.
Je souhaite terminer correctement l'installation de npm [2020]
Je veux utiliser java8 forEach avec index
rsync4j --Je veux toucher rsync en Java.
De Java à Ruby !!
Je veux jouer avec Firestore de Rails
J'ai essayé de traduire la grammaire de R et Java [Mis à jour de temps en temps]
Je veux faire quelque chose comme "cls" en Java
Je veux aussi utiliser ES2015 avec Java! → (´ ・ ω ・ `)
6 fonctionnalités que j'ai manquées après mon retour de Scala à Java
Je veux faire des transitions d'écran avec kotlin et java!
Migration de Cobol vers JAVA
Je veux convertir des caractères ...
Nouvelles fonctionnalités de Java7 à Java8
Connectez-vous de Java à PostgreSQL
De Java inefficace à Java efficace
[Java] Je souhaite convertir un tableau d'octets en un nombre hexadécimal
[JDBC] J'ai essayé d'accéder à la base de données SQLite3 depuis Java.
Je souhaite créer une applet Java sans utiliser d'IDE
Je veux faire une liste avec kotlin et java!
Je veux créer une fonction avec kotlin et java!
Exécuter R à partir d'un processus Java optimisé par Tomcat sur Amazon Linux
Je souhaite utiliser l'API Java 8 DateTime lentement (maintenant)
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3
Je veux implémenter diverses fonctions avec kotlin et java!
[Java] Je souhaite tester l'entrée standard et la sortie standard avec JUnit
Je souhaite simplifier l'instruction if-else de la branche conditionnelle en Java
En Java, je souhaite couper plusieurs caractères spécifiés uniquement du début et de la fin.
Je veux renvoyer un type différent de l'élément d'entrée avec Java8 StreamAPI Reduce ()
Exécutez node.js depuis Android Java (traitement)
Exécuter le fichier de commandes à partir de Java
J'ai essayé d'interagir avec Java
Java sera impliqué dès aujourd'hui
De Java à VB.NET - Écriture de notes de contraste
Java, interface pour partir du débutant
J'ai essayé de résumer l'apprentissage Java (1)
La route de JavaScript à Java
J'ai essayé de résumer Java 8 maintenant
[Java] Conversion d'un tableau à une liste
Je veux juste écrire Java en utilisant Eclipse sur mon Mac
Je veux revenir à l'écran précédent avec kotlin et java!
Si vous souhaitez modifier l'environnement de développement Java d'Eclipse
[Java] Je veux effectuer distinctement avec la clé dans l'objet
[Android] Je souhaite obtenir l'auditeur à partir du bouton de ListView
Ce à quoi j'ai pensé lorsque j'ai commencé à migrer de Java vers Kotlin
Je souhaite développer une application web!
Je veux écrire un joli build.gradle
Je souhaite éliminer les messages d'erreur en double