Japan.R 2020での発表です。
extendr: https://github.com/extendr/ YouTube 録画: https://www.youtube.com/watch?v=yp5faIkXt64
2020/12/05 Japan.R 2020@yutannihilation
View Slide
ドーモ!● @yutannihilation● 某メッセージングアプリの会社でデータサイエンティスト見習い● 好きな言語:R、Rust、忍殺語
今日はカニの話をします
こっちのカニです
非公式RustマスコットFerris
Rustとは● メモリ管理が安全● 速い● 並行処理に優れている…みたいな話はググってください
extendr
extendr● RからRustを使えるようにするフレームワーク● C++に対してRcppがあるのと同じような位置づけ● (RustからRを使うこともできる)
なぜRからRustを使いたいのか?
理由その1: 時代はジェンダーニュートラルな表現を求めている
理由その1: 時代はジェンダーニュートラルな表現を求めている● Rustを使う人は「Rustacean」● この圧倒的かっこよさよ...
理由その2:ツールチェーンがOSに依存しない● 組み込みのパッケージマネージャ cargo● GCCのバージョンの違いでコケるみたいなことがない● コンパイル済みバイナリの配布も簡単
理由その3:Rustのエコシステムに乗っかれる● Gamedev系が発達している(行列計算、3D、物理シミュレーションなど)● その他は謎...● Rust-Bio っていうのもあるのでバイオ系の人の感想を聞きたい
extendrの使い方※絶賛開発中なので参考までに
1. Rustの関数を書くfn hello() -> &'static str {"hello"}
2. extendrのマクロをつける#[extendr]fn hello() -> &'static str {"hello"}wrap__関数名 というCの関数が自動で生成される
3. Cに生成された関数を書くvoid wrap__hello();void *dummy = (void*) &wrap__hello;リンカに勝手に消されるのを防ぐため、とのことここはそのうちextendrが勝手にやってくれそう
4. Rから.Call()で呼び出すhello <- function() {.Call("wrap__hello")}
その他● 単一の文字列や数値などは勝手に変換してくれる● ベクトルや構造体などは Robj という型に明示的に変換が必要● エラー処理については不明
その他● バインディングはbindgenというツールで自動生成しているので、Cの関数をほぼそのままRust側で使える(Rf_...みたいなやつ)
まとめ● この冬、RustをはじめてRustaceanを名乗ってライバルに差をつけよう● RからRustを使うための仕組みextendrが絶賛開発中
参考● extendrhttps://github.com/extendr● Using Rust code in R packageshttps://jeroen.github.io/erum2018/● https://github.com/clauswilke/helloextendr/