なんじゃくにっき

プログラミングの話題中心。

ScalaからRを使う

 表題の通り、ScalaからRを使ってみます。
JRI(Java R Interface)というライブラリを使います。
 
手順説明を超適当に・・
   
まず、Rをインストールします。
環境変数R_HOMEにRをインストールしたディレクトリを設定します。
%R_HOME%\binにPathを通します。
OSがWindowsなら%R_HOME%\i386\binにもPathを通します。
Rを起動してinstall.packages('rJava')と入力してrJavaをインストールします。
(rJavaの中にJRIも含まれる)
とりあえずsbtプロジェクトを作ってProjectroot/lib/jriとかいうディレクトリ掘って、
%R_HOME%\library\rJava\jriにあるjri.jarをlibにProjectroot\libに、
%R_HOME%\library\rJava\jriにあるjri.dllをlibにProjectroot\lib\jriにピーコします。
 
sbtの設定は↓。残念ながらsbt 0.10系統用ではなくsbt 0.7.7用。

import sbt._

class RScalaProject(info: ProjectInfo) extends DefaultProject(info) {
val scalaTest = "org.scalatest" % "scalatest" % "1.0"

override def unmanagedClasspath = {
super.unmanagedClasspath +++ Path.fromFile("/lib/")
}

override def fork = Some(new ForkScalaRun {
val newPath1 = System.getProperty("java.library.path") + path("lib") / "jri"

override def runJVMOptions = super.runJVMOptions ++
Seq("-Djava.library.path=" + newPath1)

override def scalaJars = buildScalaInstance.libraryJar :: buildScalaInstance.compilerJar :: Nil
})
}

 
試しにこんなコード書いて
package hoge
import org.rosuda.JRI.{ REXP, Rengine }

object BootStrap extends App {
val engine = new Rengine(Array("--no-save"), false, null)
val result = engine.eval("1+2")
println(result.asDouble)

sys.exit(0)
}

3.0って表示されたらOK。
 
詳しくはJavaDoc見てちょ。
というよりJavaDoc以外殆ど資料が見当たりません。