Java-R integracija

1. Pregled

R je popularan programski jezik koji se koristi za statistiku. Budući da ima širok raspon funkcija i paketa, nije neuobičajen zahtjev za ugrađivanjem R koda u druge jezike.

U ovom ćemo članku pogledati neke od najčešćih načina integriranja R koda u Javu.

2. R skripta

Za naš projekt započet ćemo implementacijom vrlo jednostavne R funkcije koja uzima vektor kao ulaz i vraća sredinu njegovih vrijednosti. To ćemo definirati u namjenskoj datoteci:

customMean <- funkcija (vektor) {znači (vektor)}

Kroz ovo uputstvo, koristit ćemo Java pomoćnu metodu za čitanje ove datoteke i vraćanje njenog sadržaja kao Niz:

String getMeanScriptContent () baca IOException, URISyntaxException {URI rScriptUri = RUtils.class.getClassLoader (). GetResource ("script.R"). ToURI (); Put unosaScript = Paths.get (rScriptUri); vratiti Files.lines (inputScript) .collect (Collectors.joining ()); }

Sada, pogledajmo različite opcije koje moramo pozvati na ovu funkciju s Jave.

3. RCaller

Prva knjižnica koju ćemo razmotriti je RCaller koja može izvršavati kod stvaranjem namjenskog R procesa na lokalnom stroju.

Budući da je RCaller dostupan kod Maven Central, možemo ga jednostavno uključiti u naš pom.xml:

 com.github.jbytecode RCaller 3.0 

Dalje, napišimo prilagođenu metodu koja vraća vrijednost naših vrijednosti pomoću naše izvorne R skripte:

javna dvostruka srednja vrijednost (int [] vrijednosti) baca IOException, URISyntaxException {String fileContent = RUtils.getMeanScriptContent (); RCode kod = RCode.create (); code.addRCode (fileContent); code.addIntArray ("ulaz", vrijednosti); code.addRCode ("rezultat <- customMean (ulaz)"); Pozivatelj RCaller = RCaller.create (kôd, RCallerOptions.create ()); caller.runAndReturnResult ("rezultat"); vratiti pozivatelja.getParser (). getAsDoubleArray ("rezultat") [0]; }

U ovoj metodi uglavnom koristimo dva objekta:

  • RKod, koji predstavlja naš kontekst koda, uključujući našu funkciju, njegov ulaz i izjavu o pozivu
  • RCaller, koji nam omogućuje pokretanje koda i vraćanje rezultata

Važno je to primijetiti RCaller nije prikladan za mala i česta izračunavanja zbog vremena potrebnog za pokretanje R postupka. To je uočljiv nedostatak.

Također, RCaller radi samo s R-om instaliranim na lokalnom stroju.

4. Renjin

Renjin je još jedno popularno rješenje dostupno na području integracije R. Široko je prihvaćen, a nudi i potporu poduzećima.

Dodavanje Renjina u naš projekt je malo manje trivijalno jer moramo dodati bedatadriven spremište zajedno s Mavenovom ovisnošću:

  bedatadriven bedatadriven javni repo //nexus.bedatadriven.com/content/groups/public/ org.renjin renjin-script-engine RELEASE 

Još jednom, izradimo Java omot za našu funkciju R:

javna dvostruka srednja vrijednost (int [] vrijednosti) baca IOException, URISyntaxException, ScriptException {RenjinScriptEngine engine = new RenjinScriptEngine (); Niz meanScriptContent = RUtils.getMeanScriptContent (); engine.put ("ulaz", vrijednosti); engine.eval (meanScriptContent); Rezultat DoubleArrayVector = (DoubleArrayVector) engine.eval ("customMean (input)"); vratiti rezultat.asReal (); }

Kao što vidimo, koncept je vrlo sličan RCalleru, iako je manje opširan, budući da funkcije možemo pozivati ​​izravno po imenu pomoću eval metoda.

Glavna prednost Renjina je što ne zahtijeva R instalaciju jer koristi tumač zasnovan na JVM-u. Međutim, Renjin trenutno nije 100% kompatibilan s GNU R.

5. Rezervirajte

Biblioteke koje smo do sada pregledali dobar su izbor za lokalno pokretanje koda. Ali što ako želimo da više klijenata poziva našu R skriptu? Tu nastupa Rserve, dopuštajući nam pokretanje R koda na udaljenom računalu putem TCP poslužitelja.

Postavljanje Rezerva uključuje instalaciju povezanog paketa i pokretanje poslužitelja koji učitava našu skriptu putem R konzole:

> install.packages ("Rezerviraj") ...> biblioteka ("Rezerviraj")> Rezerviraj (args = "--RS-source ~ / script.R") Pokretanje Rezerviranja ...

Dalje, sada možemo uključiti Rserve u naš projekt dodavanjem, kao i obično, ovisnosti Maven:

 org.rosuda.REngine Rserve 1.8.1 

Na kraju, umotajmo našu R skriptu u Java metodu. Ovdje ćemo upotrijebiti RKonnekcija objekt s našom adresom poslužitelja, zadan na 127.0.0.1:6311 ako nije naveden:

javna dvostruka srednja vrijednost (int [] vrijednosti) baca REngineException, REXPMismatchException {RConnection c = new RConnection (); c. assign ("ulaz", vrijednosti); vrati c.eval ("customMean (input)"). asDouble (); }

6. FastR

Posljednja knjižnica o kojoj ćemo razgovarati je FastR. R izvedba visokih performansi izgrađena na GraalVM-u. U vrijeme pisanja ovog članka, FastR je dostupan samo na Linuxu i Darwin x64 sustavima.

Da bismo je mogli koristiti, prvo moramo instalirati GraalVM sa službene web stranice. Nakon toga, moramo instalirati FastR sam pomoću programa Graal Component Updater, a zatim pokrenuti konfiguracijsku skriptu koja dolazi s njim:

$ bin / gu instaliraj R ... $ languages ​​/ R / bin / configure_fastr

Ovaj put naš će kôd ovisiti o Polyglotu, internom API-ju GraalVM za ugrađivanje različitih gostujućih jezika u Javu. Budući da je Polyglot općeniti API, mi određujemo jezik koda koji želimo pokrenuti. Također ćemo koristiti c R funkcija za pretvorbu našeg unosa u vektor:

javna dvostruka srednja vrijednost (int [] vrijednosti) {Context polyglot = Context.newBuilder (). allowAllAccess (true) .build (); Niz meanScriptContent = RUtils.getMeanScriptContent (); polyglot.eval ("R", meanScriptContent); Vrijednost rBindings = polyglot.getBindings ("R"); Vrijednost rInput = rBindings.getMember ("c"). Izvršenje (vrijednosti); vrati rBindings.getMember ("customMean"). execute (rInput) .asDouble (); }

Slijedeći ovaj pristup, imajte na umu da je naš kôd usko povezan s JVM-om. Da biste saznali više o GraalVM, pogledajte naš članak o Graal Java JIT kompajleru.

7. Zaključak

U ovom smo članku prošli kroz neke od najpopularnijih tehnologija za integraciju R-a u Javu. Da rezimiramo:

  • RCaller je jednostavnije integrirati jer je dostupan na Maven Central
  • Renjin nudi poslovnu podršku i ne zahtijeva instaliranje R-a na lokalnom računalu, ali nije 100% kompatibilan s GNU R
  • Rezerva se može koristiti za izvršavanje R koda na udaljenom poslužitelju
  • FastR omogućuje besprijekornu integraciju s Javom, ali čini naš kod ovisnim o VM-u i nije dostupan za svaki OS

Kao i uvijek, sav kôd korišten u ovom vodiču dostupan je na GitHub-u.


$config[zx-auto] not found$config[zx-overlay] not found