Java-R integrering

1. Oversikt

R er et populært programmeringsspråk som brukes til statistikk. Siden det har et bredt utvalg av tilgjengelige funksjoner og pakker, er det ikke et uvanlig krav å legge inn R-kode på andre språk.

I denne artikkelen ser vi på noen av de vanligste måtene å integrere R-kode i Java.

2. R Skript

For vårt prosjekt starter vi med å implementere en veldig enkel R-funksjon som tar en vektor som input og returnerer gjennomsnittet av verdiene. Vi definerer dette i en dedikert fil:

customMean <- funksjon (vektor) {middel (vektor)}

Gjennom denne opplæringen bruker vi en Java-hjelpemetode for å lese denne filen og returnere innholdet som en String:

Streng getMeanScriptContent () kaster IOException, URISyntaxException {URI rScriptUri = RUtils.class.getClassLoader (). GetResource ("script.R"). ToURI (); Sti inputScript = Paths.get (rScriptUri); return Files.lines (inputScript) .collect (Collectors.joining ()); }

La oss nå se på de forskjellige alternativene vi har for å påkalle denne funksjonen fra Java.

3. RCaller

Det første biblioteket vi skal vurdere er RCaller som kan utføre kode ved å gyte en dedikert R-prosess på den lokale maskinen.

Siden RCaller er tilgjengelig fra Maven Central, kan vi bare inkludere den i vår pom.xml:

 com.github.jbytecode RCaller 3.0 

La oss deretter skrive en tilpasset metode som returnerer gjennomsnittet av verdiene våre ved å bruke vårt originale R-skript:

offentlig dobbelt gjennomsnitt (int [] verdier) kaster IOException, URISyntaxException {String fileContent = RUtils.getMeanScriptContent (); RCode-kode = RCode.create (); code.addRCode (fileContent); code.addIntArray ("input", verdier); code.addRCode ("resultat <- customMean (input)"); RCaller ringer = RCaller.create (kode, RCallerOptions.create ()); caller.runAndReturnResult ("resultat"); returner caller.getParser (). getAsDoubleArray ("resultat") [0]; }

I denne metoden bruker vi hovedsakelig to objekter:

  • RCode, som representerer kodekonteksten vår, inkludert vår funksjon, dens innspill og en påkallingsuttalelse
  • RCaller, som lar oss kjøre koden vår og få resultatet tilbake

Det er viktig å legge merke til det RCaller er ikke egnet for små og hyppige beregninger på grunn av tiden det tar å starte R-prosessen. Dette er en merkbar ulempe.

Også, RCaller fungerer bare med R installert på den lokale maskinen.

4. Renjin

Renjin er en annen populær løsning tilgjengelig i R-integrasjonslandskapet. Det er mer adoptert, og det tilbyr også støtte for bedrifter.

Å legge til Renjin i prosjektet vårt er litt mindre trivielt siden vi må legge til bedatadriven depot sammen med Maven avhengighet:

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

Nok en gang, la oss bygge en Java-wrapper til vår R-funksjon:

offentlig dobbelt gjennomsnitt (int [] verdier) kaster IOException, URISyntaxException, ScriptException {RenjinScriptEngine motor = ny RenjinScriptEngine (); Streng meanScriptContent = RUtils.getMeanScriptContent (); engine.put ("input", verdier); engine.eval (meanScriptContent); DoubleArrayVector result = (DoubleArrayVector) engine.eval ("customMean (input)"); returresultat.asReal (); }

Som vi kan se, konseptet er veldig likt RCaller, selv om det er mindre ordrikt, siden vi kan påkalle funksjoner direkte ved navn ved hjelp av eval metode.

Den største fordelen med Renjin er at den ikke krever en R-installasjon, da den bruker en JVM-basert tolk. Imidlertid er Renjin foreløpig ikke 100% kompatibel med GNU R.

5. Rserve

Bibliotekene vi har vurdert hittil er gode valg for å kjøre kode lokalt. Men hva om vi vil ha flere klienter som påberoper R-skriptet vårt? Det er her Rserve spiller inn, la oss kjøre R-kode på en ekstern maskin gjennom en TCP-server.

Å sette opp Rserve innebærer å installere den relaterte pakken og starte serveren med å laste skriptet vårt gjennom R-konsollen:

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

Deretter kan vi nå inkludere Rserve i prosjektet vårt ved, som vanlig, å legge til Maven-avhengigheten:

 org.rosuda.REngine Rserve 1.8.1 

Til slutt, la oss pakke inn R-skriptet vårt i en Java-metode. Her bruker vi en RCforbindelse objekt med serveradressen vår, som standard 127.0.0.1:6311 hvis den ikke er oppgitt:

offentlig dobbelt gjennomsnitt (int [] verdier) kaster REngineException, REXPMismatchException {RConnection c = new RConnection (); c.assign ("input", verdier); returner c.eval ("customMean (input)"). asDouble (); }

6. FastR

Det siste biblioteket vi skal snakke om er FastR. en høy ytelse R implementering bygget på GraalVM. I skrivende stund FastR er bare tilgjengelig på Linux og Darwin x64-systemer.

For å kunne bruke den, må vi først installere GraalVM fra det offisielle nettstedet. Etter det må vi installere FastR selv ved hjelp av Graal Component Updater og kjøre konfigurasjonsskriptet som følger med det:

$ bin / gu installer R ... $ språk / R / bin / configure_fastr

Denne gangen vil koden vår avhenge av Polyglot, GraalVMs interne API for å legge inn forskjellige gjestespråk i Java. Siden Polyglot er et generelt API, spesifiserer vi språket til koden vi vil kjøre. Vi bruker også c R-funksjon for å konvertere inngangen vår til en vektor:

offentlig dobbelt gjennomsnitt (int [] verdier) {Context polyglot = Context.newBuilder (). allowAllAccess (true) .build (); Streng meanScriptContent = RUtils.getMeanScriptContent (); polyglot.eval ("R", meanScriptContent); Verdi rBindings = polyglot.getBindings ("R"); Verdi rInput = rBindings.getMember ("c"). Execute (verdier); return rBindings.getMember ("customMean"). execute (rInput) .asDouble (); }

Når du følger denne tilnærmingen, må du huske at den gjør koden vår tett kombinert med JVM. For å lære mer om GraalVM, sjekk ut artikkelen vår om Graal Java JIT Compiler.

7. Konklusjon

I denne artikkelen gikk vi gjennom noen av de mest populære teknologiene for å integrere R i Java. Å oppsummere:

  • RCaller er lettere å integrere siden den er tilgjengelig på Maven Central
  • Renjin tilbyr bedriftsstøtte og krever ikke at R skal installeres på den lokale maskinen, men den er ikke 100% kompatibel med GNU R
  • Rserve kan brukes til å utføre R-kode på en ekstern server
  • FastR tillater sømløs integrasjon med Java, men gjør koden vår avhengig av VM og er ikke tilgjengelig for alle operativsystemer

Som alltid er all koden som brukes i denne opplæringen, tilgjengelig på GitHub.


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