niszetの日記

アナログCMOS系雑用エンジニアが頑張る備忘録系日記

(R) (Julia) JuliaCallパッケージを使用してRmd中からJuliaを実行して結果を表示する (メモ)

PythonInRのノリで使えば良さそう。

追記

実はid:yutannihilationさんが分かりやすい記事を既に書いていたという…(調べなさいよ…)

notchained.hatenablog.com

記事中で指摘されている件は

Fix the bug that julia_setup() fails to correctly load libjulia.dll if JULIA_HOME is not in path on windows.

ということで、最新のバージョンではJULIA_HOMEが設定されていなくても大丈夫(当然Julia見つからないというエラーは出る)でした。

状況的にはこの記事当時とあまり変わっていない気がしますね…。

おまけの本文。

Julia使いやすいけど、やはり開発環境が気になるところです。Junoも凄い使いやすいのですが、やはり使い慣れたRStudio IDE上で実行できると便利だなーと思って、まずはRからJuliaを実行できるようにしたパッケージないかなと探したところ、ありました。その名もJuliaCallパッケージ。

公式のサイトはこちら。
Seamless Integration Between R and 'Julia' • JuliaCall

CRANにもある。
CRAN - Package JuliaCall

結構前からあるから周知だったりしますかね…

Githubはこちら。何か見つけたら報告しましょうか… github.com

インストール

JulliaCallパッケージ自体はinstall.packages("JuliaCall")で良いですが、julia_setup()時にjuliaにPATHが通っていないと「Juliaが見つかりません」というエラーになります。
WIndows環境でJunoを使っている場合など、JuliaへのPATHが通っていないことがあるので要確認&設定です。

初回のこの設定が意外と?時間がかかります。何をしているのかは調べてないので良く分かりませんが…。

Rmd中にjuliaを埋め込む…

まぁ、ビニエット vignette("Julia_in_RMarkdown")を読んでください、でおしまいなのですが、それだとあんまりなので…。

Rmdのyamlヘッダのあと、要するに本文に下記のように書いて実行してみました。なお、バックスラッシュ()で始まっている行のバックスラッシュは削除してください。はてなブログにブロックの終わりと見られてしまうので、苦肉の策。何か良い方法をご存知の方は教えてください…。

\``` {r setup, include=FALSE}
library(JuliaCall)
knitr::opts_chunk$set(echo = TRUE)
knitr::knit_engines$set(julia = JuliaCall::eng_juliacall)
\```

# Julia Test

\```{julia}
# julia のチャンクの中ではjuliaのルールで実行される。
# julia はコードを実行すると結果を表示するので、下記の代入操作だけでaの値が表示される。
a = sqrt(2)
\```

\```{r}
# r のチャンクの中ではrのルールで実行される。
# 通常の代入では結果は表示されない。()で全体を囲うことで表示させられるが。
a <- sqrt(2)
# 改めて、aの値を表示するためにaと打ち込む。
a
\```

##  doc test

\```{julia}
# juliaのチャンクの中でsqrtについてヘルプを読む。
@doc sqrt
\```

## eval from R chunk

\```{r}
# RからJuliaの変数にアクセス
julia_eval("a")
\```

ということで、ひとまずRからJuliaに処理を渡したり、Rmd中にjuliaのコードを書いて平然と表示させることが出来ることは分かりました。
しかし、Rは型についてはかなり緩い一方でJuliaは型のチェックが厳しいので、その辺りの仕様をちゃんと把握しないと実用上はトラブりそうですね。

Juliaのパッケージを使用することも出来るらしいので、RとJuliaの得意な部分で住み分けて使えれば…かなり良さを感じます。 ただ、Junoで使えたようなJuliaのための入力補完や\で始まる文字、例えば≈の入力はキツイですね。Juliaのコードを外部に保存してchunkで読み込めば良い気がするのでいずれやってみましょうか…。

上記のコードの実行結果は以下のようになります(タイトルとかyamlヘッダ中のコードはここには書いていませんが…)

f:id:niszet:20180324181744p:plain

(だれか細かいところ説明してくれないかなー…)

Enjoy!!