Reports

Twitter: @mtknnktm.

JRIを使ってScalaからRを使う

RをScalaから叩く方法をメモ。
JavaからRを使う Java R Interface (JRI) というライブラリを使用します。

試した環境

  • バージョン
    • Scala: 2.10
    • SBT: 0.13.0
    • R: 3.0.2
    • OSはMac

Rの準備

まず環境変数 R_HOME を設定します。
Macの場合は以下みたいになると思います。

export R_HOME=/opt/local/Library/Frameworks/R.framework/Resources

次にJRIはRからJavaを使うパッケージ rJava についてくるので、まずRに rJava をインストールします。

install.packages('rJava')

rJavaをインストールするとMacだと /Users//Library/R/3.0/library/rJava/jri

  • JRI.jar
  • libjri.jnilib

があるので、それをScalaプロジェクトの lib 以下にコピーします(http://scalajp.github.io/sbt-getting-started-guide-ja/library-dependencies/)。

Scala

JRIにパスを通すためにbuild.sbtに以下を追記します。

javaOptions in run += "-Djava.library.path=" + System.getProperty("java.library.path") + ":lib"

これで環境は整ったはずなのでScalaからRを使ってみましょう。
App.scalaを以下のようにします。

import org.rosuda.JRI.{ REXP, Rengine }

object App {
  def main(args: Array[String]) {

    val engine = new Rengine(Array("--no-save"), false, null)
    val result = engine.eval("sum(c(1, 2, 3, 4))")
    engine.end()
    println(result.asDouble)
  }
}

以上が完了したら以下を実行して 10 と表示されたら成功です。

sbt run

以下のページを参考にしました

SBT

Forking — sbt Documentation

Scala逆引きレシピ

Scala逆引きレシピ

RとRubyによるデータ解析入門

RとRubyによるデータ解析入門