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.