父さんな、
webRビルド職人で
食ってこうと思うんだ
~Rust編~

@yutannihilation

ドーモ!

Hiroaki Yutani

webRとは?

ウェブブラウザで動くR

(https://webr.r-wasm.org/latest/)

どうやってブラウザで動いてるの?

  • Emscriptenというツールによって、WebAssemly(ブラウザで実行できるバイナリフォーマット)に変換されている
  • Emscriptenは、LLVMが対応している言語ならコンパイルできるので、Fortranも大丈夫

…と言うのは簡単

Running R-Shiny without a Server - posit::conf(2023)

これがビルド職人の力…!

Running R-Shiny without a Server - posit::conf(2023)

パッケージのインストールもできる

自分のパッケージも使えるようにしたい!

R-universeに登録すれば自動でwebRビルドしてくれる

でも、Rustを使ったパッケージはビルド失敗する…

自分でビルドする

webRのビルド用のパッケージ・rwasmを使う

自分でビルドする

専用のDockerを立ち上げる:

docker pull ghcr.io/r-wasm/webr:main
mkdir -p output
docker run -it --rm -v ${PWD}/output:/output -w /output ghcr.io/r-wasm/webr:main R

Dockerの中のRセッション:

install.packages("pak")
pak::pak("r-wasm/rwasm")
rwasm::add_pkg(".")

結果

/bin/bash: line 8: cargo: command not found

ghcr.io/r-wasm/webrにはRustがインストールされてない…

自分でDockerイメージをつくる

(Rustをインストールするだけ)

https://github.com/yutannihilation/webr-rust-docker-image

自分でGitHub Actionをつくる

(r-wasmの公式アクションをcloneしてイメージを差し替えるだけ)

https://github.com/yutannihilation/r-wasm-actions

レポジトリをつくる

webr::install(
    "savvyExamples",
    repos = "https://yutannihilation.github.io/savvy-webr-test/"
)

なんとかなりました

理解できていないところ

  • webRは例外を有効にしている関係上、Rustのpanic時のunwindを無効にしないといけないらしい

https://mstdn.social/@gws/111494461618624785

理解できていないところ

  • webRは例外を有効にしている関係上、Rustのpanic時のunwindを無効にしないといけないらしい

→ 通常、panicはRセッションをクラッシュさせるので、unwindが必要ないのはわかる。でも、有効になってて(バイナリサイズ以外)なにか困ることある…?

あと一歩…

  • 実は R-unvierse は SystemRequirements を見て Rust をインストールするようになっていた。
  • ただ、aptでインストールするので、nightlyのツールチェーンは入らない(stdをunwindなしでビルドしなおすオプションを指定するためにnightlyが必要)
error: no such command: `+nightly`

    Cargo does not handle `+toolchain` directives.
    Did you mean to invoke `cargo` through `rustup` instead?