Menghubungkan R dan Julia?

138

Julia terlihat sangat menjanjikan untuk komputasi cepat dan sintaks-waras (misalnya di sini ), tapi saya menduga itu tidak akan mendekati R dalam hal alur kerja statistik keseluruhan untuk beberapa waktu. Jadi saya ingin menggunakannya di mana C ++ terutama digunakan dalam program R: untuk mengoptimalkan bagian kode yang lambat. Sebelum saya menginvestasikan waktu untuk mempelajari Julia, saya ingin tahu fasilitas apa yang tersedia untuk menyematkan potongan Julia dalam kode R.

Begitu:

  • Fasilitas apa yang tersedia untuk menghubungkan R dan Julia?
  • Seberapa kuat dan matang mereka, pada skala nol hingga Rcpp?

Saya ingin menelepon Julia dari R, sama seperti Rcpp mengizinkan panggilan C ++ dari dalam R sekarang. Saya tidak ingin menelepon R dari Julia. (Jadi RCall.jl tidak akan berfungsi)

Ari B. Friedman
sumber
7
Dugaan saya , Anda akan menjadi pengguna yang sangat awal dan tunduk pada hukuman tersebut. Saya akan senang salah - saya juga akan senang jika Anda melakukan pekerjaan dan membuka jalan bagi kami pengguna menengah ...
Ben Bolker
15
Fungsi yang mereka gunakan dalam tolok ukur kinerja tampak seperti cara yang sangat tidak biasa untuk menggunakan R: github.com/JuliaLang/julia/blob/master/test/perf/perf.R . Ini hampir seperti memasukkan diesel ke dalam Ferarri ...
James
2
Pertanyaannya relevan. AC ABI untuk Julia tampaknya akan segera muncul. Ada kemungkinan saya akan segera mencoba membuat antarmuka Julia-to-R.
lgautier
4
Saya memiliki jembatan Julia-to-R yang bekerja secara kasar ( github.com/lgautier/Rif.jl ). Kebalikannya tergantung pada pekerjaan yang masih dalam proses di pihak Julia.
lgautier
3
@lgautier Saya sangat berharap Anda akan berhasil melanjutkan pekerjaan Anda. Sial, jika ada halaman kickstarter untuk mendukung ini, saya pasti ada di sana.
Maxim.K

Jawaban:

43

Paket RJulia R terlihat cukup bagus sekarang dari R. R CMD checkberjalan tanpa peringatan atau kesalahan (jika juliadiinstal dengan benar).

TODO terbesar dalam pandangan saya adalah membuat Julia mengembalikan daftar bernama yang merupakan struktur data umum fleksibel yang sangat mendasar di R.

Perhatikan bahwa Doug Bates memberi tahu saya tentang RCall, antarmuka dua arah dari Julia ke R (yaitu, arah selain R ke Julia). Selain itu, Doug merekomendasikan untuk menargetkan julia 0.4.0 daripada julia versi stabil saat ini.

Martin Mächler
sumber
1
Jawaban yang diterima sudah usang sampai sekarang. Cara terbaik untuk memanggil Julia dari R saat ini adalah JuliaCall (lihat jawaban Consistency di bawah), yang btw bergantung pada RCall.jl (paket Julia untuk memanggil R dari Julia).
Levasco
1
Terima kasih @Levasco. Anda benar "seperti sekarang". Saya mengakui bahwa banyak hal berubah, dan apa yang "optimal" 5,2 tahun yang lalu, sekarang tidak lagi.
Martin Mächler
59

Saya juga telah melihat Julia sejak Doug Bates mengirimi saya pemberitahuan pada bulan Januari . Tapi seperti @ gsk3, saya mengukur ini pada "skala Rcpp" karena saya ingin meneruskan objek R yang kaya ke Julia. Dan itu sepertinya tidak didukung sama sekali saat ini.

Julia memiliki antarmuka C yang bagus dan sederhana. Jadi itu membuat kita menyukai .C(). Tetapi seperti yang baru-baru ini dibahas di r-devel, Anda benar-benar tidak ingin .C(), dalam banyak kasus Anda lebih suka .Call()untuk meneruskan variabel SEXP aktual yang mewakili objek R nyata. Jadi sekarang saya melihat sedikit ruang untuk Julia dari R karena keterbatasan ini.

Mungkin antarmuka tidak langsung yang menggunakan tcp / ip to Rserve bisa menjadi permulaan pertama sebelum Julia sedikit matang dan kami mendapatkan antarmuka C ++ yang tepat. Atau kita menggunakan sesuatu berdasarkan Rcpp untuk berpindah dari R ke C ++ sebelum kita memasuki lapisan perantara [yang harus ditulis oleh seseorang] dari mana kita memberi umpan data ke Julia, seperti R API sebenarnya hanya menawarkan lapisan C. Entahlah.

Dan pada akhirnya, beberapa kesabaran mungkin dibutuhkan. Saya mulai melihat R sekitar tahun 1996 atau 1997 ketika Fritz Leisch membuat pengumuman pertama di newsgroup comp.os.linux.announce. Dan R memiliki fasilitas yang agak terbatas saat itu (tetapi janji penuh dari bahasa S, tentu saja, jika kami tahu kami memiliki pemenang). Dan beberapa tahun kemudian saya siap menjadikannya sebagai bahasa pemodelan utama saya. Saat itu CRAN masih memiliki kurang dari 100 paket ...

Julia mungkin akan sampai di sana. Tetapi untuk saat ini saya curiga banyak dari kita akan menyelesaikan pekerjaan di R, dan hanya melihat sekilas Julia yang aneh.

Dirk Eddelbuettel
sumber
1
karena sepengetahuan saya tidak ada rencana bagi julia untuk memiliki kompiler statis untuk memungkinkan penyematan di C ++, kami mungkin harus menunggu beberapa saat
pyCthon
48

Rencana pengembangan Julia, seperti yang saya jelaskan dalam jawaban ini adalah untuk memungkinkan kompilasi kode Julia ke pustaka bersama, dapat dipanggil menggunakan C ABI. Setelah ini terjadi, akan mudah untuk memanggil kode Julia dari R seperti memanggil kode C / C ++. Namun, ada cukup banyak pekerjaan yang diperlukan sebelum ini menjadi mungkin.

StefanKarpinski
sumber
4
Kedengarannya sangat menjanjikan. Saya (dan saya pikir orang lain) melihat Julia sebagai pengganti yang bagus untuk bagaimana Matlab saat ini digunakan - untuk hasil komputasi-berat yang masih membutuhkan lebih banyak intuisi matematika daripada C dan yang disediakan sejenisnya. Untuk itu, R dan Julia bisa menjadi pelengkap yang luar biasa. Bahkan jika Julia menggantikan R (dan saya akan baik-baik saja dengan itu, terus terang), setidaknya satu dekade sebelum perpustakaan statistik di Julia hampir sekaya, jadi sementara itu kemampuan antarmuka antara R dan Julia dapat membantu membuka komputasi statistik -sumber berkembang pesat.
Ari B. Friedman
8
Apakah situasi ini telah berubah sejak Anda menulis ini? (ps Saya mencintai Julia, terima kasih atas pekerjaan Anda!)
Andy Hayden
23

Pembaruan cepat. Sejak pertanyaan ini diajukan, telah ada permulaan dari paket Julia yang memungkinkan seseorang untuk memanggil program R dari dalam Julia.

Selengkapnya di sini: https://github.com/lgautier/Rif.jl

aviks
sumber
1
Terima kasih, tapi lihat komentar dari lgautier sendiri di atas. Ini berlawanan arah. Saya ingin menelepon Julia dari dalam R.
Ari B. Friedman
5
1 karena dalam topik sempit seperti Julia setiap info cukup informatif
Qbik
Seperti yang dikatakan @ AriB.Friedman, ini bukan info baru - dan kami semua ingin menelepon Julia dari R, bukan sebaliknya.
Martin Mächler
14

Saya membuat paket R bernama JuliaCallbaru - baru ini, yang menyematkan Julia di R. Paket tersebut ada di CRAN.

https://cran.r-project.org/web/packages/JuliaCall/index.html

https://github.com/Non-Contradiction/JuliaCall

Penggunaan paketnya seperti ini:

library(JuliaCall)
julia <- julia_setup()
julia_command("a = sqrt(2)"); julia_eval("a")
julia_eval("sqrt(2)")
julia_call("sqrt", 2)
julia_eval("sqrt")(2)

Seperti yang Anda lihat, Anda dapat mengirim string perintah dan memanggil fungsi Julia dengan sangat mudah.

Dan ada juga beberapa paket R yang membungkus paket Julia menggunakan JuliaCall, misalnya,

  • convexjlr untuk Pemrograman Cembung Disiplin dalam R menggunakan Convex.jl, yang juga ada di CRAN.
  • ipoptjlr, R Interface for Interior Point OPTimizer (IPOPT) menggunakan paket Julia Ipopt.jl.

Selamat datang untuk umpan balik apa pun tentang JuliaCall!!

Konsistensi
sumber
Bisakah Anda membantu saya, tolong - bagaimana saya bisa keluar dari Julia menggunakan JuliaCall? Saya menjalankan kode di R dan di salah satu bagian pipa saya menghitung Model Campuran di Julia (menggunakan JuliaCall). Jadi, saya ingin membunuh proses julia setelah menyelesaikan eksekusi model campuran. Apa itu mungkin? Saya mencoba julia_command("exit()"), tetapi itu juga mematikan sesi R :(
red_quark
@red_quark Secara umum tidak perlu membunuh proses julia. Apakah ada alasan khusus? Jika demikian, mungkin Anda dapat memposting pertanyaan lain di stackoverflow atau github.
Konsistensi
Ini diperlukan untuk melepaskan RAM (yang dialokasikan untuk proses Julia) ke OS. Saya sudah memiliki pertanyaan seperti itu di stackoverflow: stackoverflow.com/questions/61000913/…
red_quark
@red_quark Untuk melepaskan memori, Anda dapat melepaskan memori di julia daripada menutup julia. Misalnya, perhatikan variabel global dan gunakan fungsi sebanyak mungkin. Saya baru-baru ini menjawab pertanyaan serupa di GitHub. Mungkin itu berguna untuk Anda. < github.com/Non-Contradiction/JuliaCall/issues/139 >
Konsistensi
13

Apakah ada yang melihat proyek ini?

https://github.com/armgong/RJulia

Cukup baru tetapi tampaknya melakukan apa yang diminta!

Adam
sumber
4
Terima kasih atas petunjuknya. Memang ini akan menjadi solusi jika berhasil. Saya mencoba menginstal (menggunakan R 3.1.2 yang ditambal saat ini) dan julia (0.4.0-dev .. diperbarui pada 30 Desember 2014 sebagai paket ubuntu). Kemudian kompilasi gagal dan saya membuka masalah github github.com/armgong/RJulia/issues/10 Mari berharap kita melangkah lebih jauh ... segera
Martin Mächler
1
Adakah peningkatan? Saya mendapatkan pemberitahuan pengembangan yang cukup aktif dari repo github mereka jadi saya membayangkan masalah sedang diselesaikan ...
Adam
2
Memang! Tidak ditindaklanjuti di sini - tetapi pada halaman masalah di atas: Semua masalah utama telah dihapus. Saya telah mengajukan diri untuk membuat paket lebih dekat menjadi dapat dilepas (ke CRAN), yaitu dengan menambahkan halaman bantuan yang berguna. Tapi sayangnya, aku terlalu asyik dengan kesibukan lainnya, jadi ini harus menunggu (untukku) sekarang.
Martin Mächler
7

Ada juga paket XRJulia dari keluarga XR paket yang ditujukan untuk e X tend R oleh John Chambers (salah satu pencipta R). Ini menggunakan pendekatan yang sedikit berbeda (JSON) untuk mentransfer data antara Julia dan R lalu rJulia dan paket serupa.

vh-d
sumber
5

Anda juga mungkin ingin memeriksa percobaan saya: JuliaConnectoRPaket-R. Paket ini tersedia dari GitHub dan CRAN .

Tujuannya adalah untuk mengimpor fungsi dari Julia secara langsung di R sehingga dapat digunakan seperti fungsi R dalam kode R. Nilai yang dikembalikan dari fungsi Julia diterjemahkan ke struktur data R, yang dapat digunakan di R dan juga diteruskan kembali ke Julia. Untuk integrasi lebih lanjut dari Julia dan R, dimungkinkan juga untuk memanggil kembali dari Julia ke R dengan meneruskan fungsi R sebagai fungsi panggilan balik.

Mirip dengan XRJulia, JuliaConnectoR bergantung pada TCP, tetapi berorientasi fungsional dan menggunakan format streaming khusus yang dioptimalkan daripada pesan JSON berbasis teks seperti yang dilakukan XRJulia. Satu keuntungan dari komunikasi dengan TCP adalah stabilitas yang berkaitan dengan versi Julia dan R. Yang berbeda jauh lebih sulit untuk dipertahankan dengan integrasi pada tingkat antarmuka C seperti yang dilakukan RCall dan JuliaCall.

Paket ini berfungsi dengan Julia ≥ 1.0 dan berbagai versi R.

esel
sumber