web-dev-qa-db-fra.com

Intégration Java-R?

J'ai une application Java qui doit effectuer une régression partielle des moindres carrés. Il semblerait qu'il n'y ait pas d'implémentations Java de PLSR). Weka pourrait avoir eu quelque chose comme à un moment donné, mais ce n'est plus dans l'API. D'un autre côté, j'ai trouvé une bonne implémentation R, qui a un bonus supplémentaire. Elle a été utilisée par les personnes dont je veux reproduire le résultat, ce qui signifie qu'il y a moins de chances que les choses tournent mal en raison des différences dans la façon dont le PLSR est mis en œuvre.

La question est: existe-t-il un package suffisamment bon (et simple à utiliser) qui permet à Java d'appeler R, de passer certains paramètres à une fonction et de relire les résultats? Mon autre option est de avoir Java spawn R dans un processus, puis le surveiller. Les données seraient lues et écrites sur le disque. Lequel des deux recommanderiez-vous? La troisième option évidente me manque-t-elle?

53
mbatchkarov

J'ai utilisé avec succès deux alternatives dans le passé.

JRI

  • Avantages : probablement de meilleures performances.
  • Inconvénients : vous devez configurer certaines variables d'environnement et bibliothèques, différentes sous Win/UNIX.

RServe

  • Avantages : facile à configurer, vous n'avez pas besoin d'initialiser R ou de créer un lien avec une bibliothèque R, peut fonctionner sur une machine différente.
  • Inconvénients : basé sur TCP/IP (un serveur est en cours d'exécution), aucun rappel de R.

Autres alternatives Je n'ai jamais utilisé: RCaller

49
Guido

Il y a eu des travaux par Duncan Temple Lang: http://rss.acs.unt.edu/Rdoc/library/SJava/Docs/RFromJava.pdf .

Ma conjecture quant à la solution la plus robuste serait JGR . Les développeurs de JGR ont une liste de diffusion, Stats-Rosuda et Archive de la liste de diffusion indique que la liste reste active à partir de 2013.

Il y a aussi du code qui a été mis en place sur Googlecode , avec un exemple ici: http://stdioe.blogspot.com/2011/07/rcaller-20-calling-r- from-Java.html

10
42-

Ceci est une vieille question .. mais pour tous ceux qui naviguent ici qui sont toujours intéressés: j'ai écrit un article de blog qui fournit un exemple détaillé de la façon d'utiliser JRI/rjava (un pont basé sur JNI) pour faire ce type de chose (le comment -to se concentre sur les environnements de développement Linux). Je compare et contraste également des approches alternatives pour faire des trucs "mathématiques" en appelant à R et à des cadres similaires.

URL> http://buildlackey.com/integrating-r-and-Java-with-jrirjava-a-jni-based-bridge/

8
Chris Bedford

Renjin est une alternative qui permet non seulement l'intégration de nombreux packages de R, mais aussi une communication facile entre Java et R via des objets:

http://www.renjin.org/

6
juanmajmjr

JRI a une interface de bas niveau et de haut niveau pour appeler R à partir de Java. Il existe un plugin Eclipse qui aide à configurer l'environnement R Java sur http://www.studytrails.com/RJava-Eclipse-Plugin/ .

3
user1569047

Cela semble être une vieille question. Cependant Rserve et rJava sont deux bons packages pour intégrer R à Java. Les blogs suivants expliquent l'utilisation de ces deux bibliothèques.

Pour rJava: http://www.codophile.com/how-to-integrate-r-with-Java-using-rjava/

Pour Rserve: http://www.codophile.com/how-to-integrate-r-with-Java-using-rserve/

J'espère que cela vous aidera.

3
Rajeev Singh

J'ai eu un besoin similaire il y a quelque temps et j'ai testé quelques-unes des interfaces de R. Celle que j'ai trouvée la meilleure pour mes besoins (windows, c #) était Rserve qui, je crois, est écrite en Java. Mon seul reproche, c'est que ce n'était pas du 64 bits. J'ai utilisé un simple client écrit en c # et cela a très bien fonctionné. Je suis sûr que le client Java est beaucoup mieux.

1
darckeen

FastR est une implémentation basée sur GraalVM de R. L'incorporer dans une application JVM est aussi simple que:

Context ctx = Context.newBuilder("R").allowAllAccess(true).build();
ctx.eval("R", "sum").execute(new int[] {1,2,3});

Plus de détails dans cet article: https://medium.com/graalvm/faster-r-with-fastr-4b8db0e0dceb

1
Steves