Integrácia Java-R

1. Prehľad

R je populárny programovací jazyk používaný pre štatistiku. Pretože má k dispozícii širokú škálu funkcií a balíkov, nie je nezvyčajnou požiadavkou vložiť R kód do iných jazykov.

V tomto článku sa pozrieme na niektoré z najbežnejších spôsobov integrácie R kódu do Javy.

2. R skript

Pre náš projekt začneme implementáciou veľmi jednoduchej funkcie R, ktorá vezme vektor ako vstup a vráti strednú hodnotu jeho hodnôt. Definujeme to vo vyhradenom súbore:

customMean <- funkcia (vektor) {priemer (vektor)}

V celom tomto výučbe použijeme pomocnú metódu Java na prečítanie tohto súboru a vrátenie jeho obsahu ako String:

Reťazec getMeanScriptContent () vyvolá IOException, URISyntaxException {URI rScriptUri = RUtils.class.getClassLoader (). GetResource ("script.R"). ToURI (); Path inputScript = Paths.get (rScriptUri); vrátiť Files.lines (inputScript) .collect (Collectors.joining ()); }

Teraz sa pozrime na rôzne možnosti, ktoré musíme vyvolať z Java.

3. RCaller

Prvá knižnica, ktorú zvážime, je RCaller, ktorý dokáže spustiť kód tak, že na miestnom počítači vytvorí vyhradený proces R.

Pretože RCaller je k dispozícii od Maven Central, môžeme ho jednoducho zahrnúť do nášho pom.xml:

 com.github.jbytecode RCaller 3.0 

Ďalej napíšeme vlastnú metódu, ktorá vráti priemer našich hodnôt pomocou nášho pôvodného skriptu R:

public double mean (int [] values) throws IOException, URISyntaxException {String fileContent = RUtils.getMeanScriptContent (); RCode kód = RCode.create (); code.addRCode (fileContent); code.addIntArray ("vstup", hodnoty); code.addRCode ("vysledok <- customMean (vstup)"); RCaller caller = RCaller.create (code, RCallerOptions.create ()); caller.runAndReturnResult ("výsledok"); return caller.getParser (). getAsDoubleArray ("výsledok") [0]; }

V tejto metóde používame hlavne dva objekty:

  • RCode, ktorý predstavuje náš kontext kódu vrátane našej funkcie, jeho vstupu a príkazu na vyvolanie
  • RCaller, čo nám umožňuje spustiť náš kód a získať výsledok späť

Je dôležité si to všimnúť RCaller nie je vhodný pre malé a časté výpočty z dôvodu času potrebného na spustenie procesu R. Toto je zjavná nevýhoda.

Tiež RCaller pracuje iba s R nainštalovaným na lokálnom počítači.

4. Renjin

Renjin je ďalšie populárne riešenie dostupné v integračnom prostredí R. Je širšie prijatý a ponúka tiež podporu pre podniky.

Pridanie Renjinu do nášho projektu je o niečo menej triviálne, pretože musíme pridať bedatadriven úložisko spolu so závislosťou Maven:

  bedatadriven bedatadriven verejné repo //nexus.bedatadriven.com/content/groups/public/ org.renjin renjin-script-engine SPRÁVA 

Opäť zostavíme obálku Java pre našu funkciu R:

public double mean (int [] values) throws IOException, URISyntaxException, ScriptException {RenjinScriptEngine engine = new RenjinScriptEngine (); Reťazec meanScriptContent = RUtils.getMeanScriptContent (); engine.put ("vstup", hodnoty); engine.eval (meanScriptContent); Výsledok DoubleArrayVector = (DoubleArrayVector) engine.eval ("customMean (input)"); vrátiť výsledok.asReal (); }

Ako vidíme, koncept je veľmi podobný RCalleru, aj keď je menej verný, pretože funkcie môžeme vyvolať priamo pomocou názvu pomocou eval metóda.

Hlavnou výhodou Renjinu je, že nevyžaduje inštaláciu R, pretože používa tlmočník založený na JVM. Avšak Renjin v súčasnosti nie je stopercentne kompatibilný s GNU R.

5. Rezervovať

Knižnice, ktoré sme doteraz skontrolovali, sú dobrou voľbou na miestne spustenie kódu. Ale čo keď chceme, aby náš R skript vyvolávalo viac klientov? Tu prichádza na rad Rserve, umožňujú nám spustiť R kód na vzdialenom počítači cez server TCP.

Nastavenie Rserve zahŕňa inštaláciu súvisiaceho balíka a spustenie servera, ktorý načítava náš skript, prostredníctvom konzoly R:

> install.packages ("Rserve") ...> Library ("Rserve")> Rserve (args = "--RS-source ~ / script.R") Spustenie Rserve ...

Ďalej môžeme teraz zahrnúť Rserve do nášho projektu pridaním závislosti Maven:

 org.rosuda.REngine Rserve 1.8.1 

Nakoniec náš R skript zabalíme do metódy Java. Tu použijeme R Pripojenie objekt s našou adresou servera, predvolene 127.0.0.1:6311, ak nie je uvedený:

public double mean (int [] values) throws REngineException, REXPMismatchException {RConnection c = new RConnection (); c.assign ("vstup", hodnoty); návrat c.eval ("customMean (input)"). asDouble (); }

6. FastR

Posledná knižnica, o ktorej si povieme, je FastR. vysokovýkonná implementácia R postavená na GraalVM. V čase písania tohto článku FastR je k dispozícii iba v systémoch Linux a Darwin x64.

Aby sme ho mohli používať, musíme si najskôr nainštalovať GraalVM z oficiálnych webových stránok. Potom musíme nainštalovať samotný FastR pomocou nástroja Graal Component Updater a potom spustiť konfiguračný skript, ktorý je s ním dodávaný:

$ bin / gu nainštalovať R ... $ jazyky / R / bin / configure_fastr

Náš kód bude tentokrát závisieť na Polyglot, internom API GraalVM na vkladanie rôznych jazykov hostí do Javy. Pretože Polyglot je všeobecné API, určujeme jazyk kódu, ktorý chceme spustiť. Použijeme tiež c Funkcia R na prevod nášho vstupu na vektor:

public double mean (int [] values) {Context polyglot = Context.newBuilder (). allowAllAccess (true) .build (); Reťazec meanScriptContent = RUtils.getMeanScriptContent (); polyglot.eval ("R", meanScriptContent); Hodnota rBindings = polyglot.getBindings ("R"); Hodnota rInput = rBindings.getMember ("c"). Execute (hodnoty); return rBindings.getMember ("customMean"). execute (rInput) .asDouble (); }

Ak budete postupovať podľa tohto prístupu, nezabudnite, že náš kód je úzko prepojený s JVM. Ak sa chcete dozvedieť viac informácií o GraalVM, prečítajte si náš článok o kompilátore Graal Java JIT.

7. Záver

V tomto článku sme prešli niektorými z najpopulárnejších technológií integrácie R v Jave. Sumarizovať:

  • RCaller sa ľahšie integruje, pretože je k dispozícii v Maven Central
  • Spoločnosť Renjin ponúka podnikovú podporu a nevyžaduje inštaláciu R na miestnom počítači, ale nie je stopercentne kompatibilná s GNU R.
  • Rserve možno použiť na vykonanie R kódu na vzdialenom serveri
  • FastR umožňuje bezproblémovú integráciu s Javou, ale robí náš kód závislým od VM a nie je k dispozícii pre každý OS

Ako vždy, všetok kód použitý v tomto tutoriále je k dispozícii na GitHub.


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