Integrasi Java-R

1. Ikhtisar

R adalah bahasa pemrograman populer yang digunakan untuk statistik. Karena ia memiliki beragam fungsi dan paket yang tersedia, bukan hal yang aneh untuk menyematkan kode R ke dalam bahasa lain.

Pada artikel ini, kita akan melihat beberapa cara paling umum untuk mengintegrasikan kode R ke dalam Java.

2. R Script

Untuk proyek kita, kita akan mulai dengan mengimplementasikan fungsi R yang sangat sederhana yang mengambil vektor sebagai input dan mengembalikan mean dari nilainya. Kami akan menentukan ini dalam file khusus:

customMean <- function(vector) { mean(vector) }

Sepanjang tutorial ini, kita akan menggunakan metode pembantu Java untuk membaca file ini dan mengembalikan isinya sebagai String :

String getMeanScriptContent() throws IOException, URISyntaxException { URI rScriptUri = RUtils.class.getClassLoader().getResource("script.R").toURI(); Path inputScript = Paths.get(rScriptUri); return Files.lines(inputScript).collect(Collectors.joining()); }

Sekarang, mari kita lihat opsi berbeda yang kita miliki untuk menjalankan fungsi ini dari Java.

3. RCaller

Pustaka pertama yang akan kita pertimbangkan adalah RCaller yang dapat mengeksekusi kode dengan menelurkan proses R khusus pada mesin lokal.

Karena RCaller tersedia dari Maven Central, kami dapat memasukkannya ke dalam pom.xml kami :

 com.github.jbytecode RCaller 3.0 

Selanjutnya, mari kita tulis metode khusus yang mengembalikan rata-rata nilai kita dengan menggunakan skrip R asli kita:

public double mean(int[] values) throws IOException, URISyntaxException { String fileContent = RUtils.getMeanScriptContent(); RCode code = RCode.create(); code.addRCode(fileContent); code.addIntArray("input", values); code.addRCode("result <- customMean(input)"); RCaller caller = RCaller.create(code, RCallerOptions.create()); caller.runAndReturnResult("result"); return caller.getParser().getAsDoubleArray("result")[0]; }

Dalam metode ini kami terutama menggunakan dua objek:

  • RCode , yang mewakili konteks kode kami, termasuk fungsi kami, inputnya, dan pernyataan pemanggilan
  • RCaller , yang memungkinkan kita menjalankan kode kita dan mendapatkan hasilnya kembali

Penting untuk diperhatikan bahwa RCaller tidak cocok untuk komputasi kecil dan sering karena waktu yang dibutuhkan untuk memulai proses R. Ini adalah kelemahan yang nyata.

Selain itu, RCaller hanya berfungsi dengan R yang diinstal pada mesin lokal .

4. Renjin

Renjin adalah solusi populer lainnya yang tersedia di lanskap integrasi R. Ini lebih banyak diadopsi, dan juga menawarkan dukungan perusahaan .

Menambahkan Renjin ke proyek kita sedikit lebih mudah karena kita harus menambahkan repositori bedatadriven bersama dengan ketergantungan Maven:

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

Sekali lagi, mari kita buat pembungkus Java ke fungsi R kita:

public double mean(int[] values) throws IOException, URISyntaxException, ScriptException { RenjinScriptEngine engine = new RenjinScriptEngine(); String meanScriptContent = RUtils.getMeanScriptContent(); engine.put("input", values); engine.eval(meanScriptContent); DoubleArrayVector result = (DoubleArrayVector) engine.eval("customMean(input)"); return result.asReal(); }

Seperti yang bisa kita lihat, konsepnya sangat mirip dengan RCaller, meskipun tidak terlalu bertele-tele , karena kita bisa memanggil fungsi secara langsung dengan nama menggunakan metode eval .

Keuntungan utama dari Renjin adalah tidak memerlukan instalasi R karena ia menggunakan juru bahasa berbasis JVM. Namun, Renjin saat ini tidak 100% kompatibel dengan GNU R.

5. Rawat

Perpustakaan yang telah kami ulas sejauh ini adalah pilihan yang baik untuk menjalankan kode secara lokal. Tetapi bagaimana jika kita ingin memiliki banyak klien yang menjalankan skrip R kita? Di situlah Rserve berperan, membiarkan kita menjalankan kode R pada mesin jarak jauh melalui server TCP .

Menyiapkan Rserve melibatkan penginstalan paket terkait dan memulai server memuat skrip kami, melalui konsol R:

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

Selanjutnya, kita sekarang dapat menyertakan Rserve dalam proyek kita dengan, seperti biasa, menambahkan dependensi Maven:

 org.rosuda.REngine Rserve 1.8.1 

Terakhir, mari kita bungkus skrip R kita menjadi metode Java. Di sini kita akan menggunakan objek RConnection dengan alamat server kita, dengan default 127.0.0.1:6311 jika tidak disediakan:

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

6. FastR

Perpustakaan terakhir yang akan kita bicarakan adalah FastR. implementasi R berkinerja tinggi yang dibangun di atas GraalVM. Pada saat tulisan ini dibuat, FastR hanya tersedia pada sistem Linux dan Darwin x64 .

Untuk menggunakannya, pertama-tama kita perlu menginstal GraalVM dari situs resminya. Setelah itu, kita perlu menginstal FastR sendiri menggunakan Graal Component Updater dan kemudian menjalankan skrip konfigurasi yang menyertainya:

$ bin/gu install R ... $ languages/R/bin/configure_fastr

Kali ini kode kami akan bergantung pada Polyglot, API internal GraalVM untuk menyematkan bahasa tamu yang berbeda di Java. Karena Polyglot adalah API umum, kami menentukan bahasa kode yang ingin kami jalankan. Juga, kita akan menggunakan fungsi c R untuk mengubah input kita menjadi vektor:

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

Saat mengikuti pendekatan ini, perlu diingat bahwa itu membuat kode kita terkait erat dengan JVM . Untuk mempelajari lebih lanjut tentang GraalVM, lihat artikel kami di Graal Java JIT Compiler.

7. Kesimpulan

Pada artikel ini, kami membahas beberapa teknologi paling populer untuk mengintegrasikan R di Java. Untuk menyimpulkan:

  • RCaller lebih mudah diintegrasikan karena tersedia di Maven Central
  • Renjin menawarkan dukungan perusahaan dan tidak memerlukan R untuk diinstal pada mesin lokal tetapi tidak 100% kompatibel dengan GNU R.
  • Rserve dapat digunakan untuk menjalankan kode R pada server jauh
  • FastR memungkinkan integrasi tanpa batas dengan Java tetapi membuat kode kami bergantung pada VM dan tidak tersedia untuk setiap OS

Seperti biasa, semua kode yang digunakan dalam tutorial ini tersedia di GitHub.