JuliaからRを使う
先日のWACODE夏期講習でRCall.jlのデモをしたら、やはりウケが良かったようなので改めて紹介をします。
RCall.jlはJuliaからR言語の機能を呼び出すツールです。データの受け渡しからREPLでのインタラクティブな実行・プロットも簡単にできます。Juliaを使ってみたいけど、Rの豊富な資産を捨てる訳にはいかないといった方にはピッタリのライブラリです。
インストールは、Juliaの標準的な方法通り、julia -e 'Pkg.update(); Pkg.add(“RCall”)’
を実行して下さい。これで最新版のRCall.jlがインストールされることになります。尚、次期Juliaのリリース候補v0.5-RC1では現在動かないようですが、リリースブランチでは直っているのでRC2では使えると思います。
簡単な演算で正しくインストールできたかを確認しましょう。JuliaのREPLを起動して、using RCall
としてRCall.jlを読み込み、R”1 + 1”
と打ってR言語で1 + 1
を実行してみます。以下のように計算結果が表示されればOKです。
R”…"
という記法は、Juliaの非標準文字列と呼ばれる機能を利用したものです。この文字列の内側ではRのコードとして解釈され、Rの処理系がコードを実行してくれます。ダブルクウォートが含まれる場合はバックスラッシュでエスケープするか、R””” … “””
とトリプルクウォートを使うこともできます。
R側の評価値を取り出す場合には、rcopy
が使えます。
julia> rcopy(R"1 + 1") 2.0 julia> rcopy(R"1:5") 5-element Array{Int32,1}: 1 2 3 4 5 julia> rcopy(R"""list(x=10, y="foo")""") Dict{Symbol,Any} with 2 entries: :y => "foo" :x => 10.0
R側へJuliaの値を渡すには$
で変数を埋め込みます。
julia> x = 1 1 julia> R"1 + $x" RCall.RObject{RCall.RealSxp} [1] 2
JuliaのDataFrames.jlパッケージが提供しているDataFrame
なども自動的にRのdata.frame
へと変換してくれます。
julia> using RDatasets julia> iris = dataset("datasets", "iris"); julia> typeof(iris) DataFrames.DataFrame julia> R"head($iris)" RCall.RObject{RCall.VecSxp} SepalLength SepalWidth PetalLength PetalWidth Species 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3.0 1.4 0.2 setosa 3 4.7 3.2 1.3 0.2 setosa 4 4.6 3.1 1.5 0.2 setosa 5 5.0 3.6 1.4 0.2 setosa 6 5.4 3.9 1.7 0.4 setosa
プロットも簡単にできます。以下のようにすると、Juliaから渡したデータをRがプロットしてくれます。
julia> R"""pairs($iris[1:4], pch=21, bg=c("red", "green3", "blue")[unclass($iris$Species)])""" RCall.RObject{RCall.NilSxp} NULL
いちいちR”…”
で囲んだりが面倒なら、RのREPLに入りましょう。JuliaのREPLから$キーを押すと、RのREPLに入れます。Juliaに戻るにはバックスペースです。
ここではRの文法が自由に使えるので、Rユーザーにとってはやりやすいでしょう。もちろん、Julia側からデータを受け取ることもR”…”
の時と同じように可能です。
R> library(ggplot2) R> ggplot($iris, aes(x=SepalLength, y=SepalWidth, color=Species)) + geom_point()
Rのセッションではヘルプなども参照できますし補完も効きます。Juliaは気になるけどRから離れるのはチョット…という方は是非一度試してみてください。