トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

BugTrack-R備忘録/24

R備忘録 /状態空間モデリング/donlp2/その他のメモ

R備忘録 - 記事一覧

rJavaを使ってRserveと通信してみる

  • 投稿者: みゅ
  • カテゴリ: なし
  • 優先度: 普通
  • 状態: 完了
  • 日時: 2009年02月04日 15時03分13秒

内容

rJavaを使ってRからRserveと通信してみる

JRclientを作る

  • JavaはwindowsでもLinuxでもプラットフォームに依存しないらしいので、みゅはWindowsでjarファイルを作りました.
  • Eclipseでああやってこうやって(適当・・・)、classファイルのjarファイルを作ります.とりあえず以下のようになります.
>jar tf JRclient.jar
META-INF/MANIFEST.MF
org/rosuda/REngine/REXPLogical.class
org/rosuda/REngine/REXPS4.class
org/rosuda/REngine/REXPLanguage.class
org/rosuda/REngine/REXPGenericVector.class
org/rosuda/REngine/REXPList.class
org/rosuda/REngine/REXPFactor.class
org/rosuda/REngine/REXPUnknown.class
org/rosuda/REngine/REXPNull.class
org/rosuda/REngine/REXPMismatchException.class
org/rosuda/REngine/REXPVector.class
org/rosuda/REngine/REXPEnvironment.class
org/rosuda/REngine/REXPInteger.class
org/rosuda/REngine/REXP.class
org/rosuda/REngine/REXPDouble.class
org/rosuda/REngine/MutableREXP.class
org/rosuda/REngine/REngineException.class
org/rosuda/REngine/RList.class
org/rosuda/REngine/REXPString.class
org/rosuda/REngine/REXPReference.class
org/rosuda/REngine/RFactor.class
org/rosuda/REngine/REXPSymbol.class
org/rosuda/REngine/REXPRaw.class
org/rosuda/REngine/REngine.class
org/rosuda/REngine/REXPExpressionVector.class
org/rosuda/REngine/LICENSE
org/rosuda/REngine/Makefile
org/rosuda/REngine/Rserve/RFileOutputStream.class
org/rosuda/REngine/Rserve/RSession.class
org/rosuda/REngine/Rserve/RserveException.class
org/rosuda/REngine/Rserve/RFileInputStream.class
org/rosuda/REngine/Rserve/RConnection.class
org/rosuda/REngine/Rserve/Makefile
org/rosuda/REngine/Rserve/protocol/REXPFactory.class
org/rosuda/REngine/Rserve/protocol/RPacket.class
org/rosuda/REngine/Rserve/protocol/jcrypt.class
org/rosuda/REngine/Rserve/protocol/RTalk.class
  • みゅの場合これをLinuxにコピーします.
jar tf /opt/sun-jdk-1.6.0.11/jre/lib/JRclient.jar
  • ここに置きます.というか、わかりやすいとこならどこでも良いです.以下のCLASSPATHを通せばよいだけですし.
  • CLASSPATHにこのjarファイルを設定します..bashrcなどに.
export CLASSPATH=$CLASSPATH:/opt/sun-jdk-1.6.0.11/jre/lib/JRclient.jar
  • 準備完了
  • 「rJAva」の関数「.jaddClassPath(path)」でも設定できるぽい.つまり、環境変数で設定しなくても、Rに入ってからでも設定できます.

実行してみる

> library(rJava)
>  .jinit() # this starts the JVM
> rcn <- .jnew("org/rosuda/REngine/Rserve/RConnection")
> rcn
[1] "Java-Object{org.rosuda.REngine.Rserve.RConnection@66848c}"
  • あっさり動いた!!
  • 接続にサーバーを指定していませんので、ローカル(つまり同じマシン)のRserveにつなぎに行っています.
  • もちろんRserveをインストールして、サーバーを起動しておいてください.今回ローカルで動かしているバージョンは【Rserve_0.6-0.tar.gz】です.
  • 切断
> .jcall(rcn, "V", "close")

eval

  • なんとこんな使い方が!
> iris1 <- rcn$eval("iris[,1]")
> iris1
[1] "Java-Object{org.rosuda.REngine.REXPDouble@14693c7[150]}"
  • Rのベクトルに直す
> iris2 <- iris1$asDoubles()
> iris2
[1] "Java-Object{[D@109a4c}"
> .jevalArray(iris2)
  [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1
 [19] 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0
 [37] 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0 6.4 6.9 5.5
 [55] 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8 6.2 5.6 5.9 6.1
 [73] 6.3 6.1 6.4 6.6 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4 6.0 6.7 6.3 5.6 5.5
 [91] 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3
[109] 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7 6.0 6.9 5.6 7.7 6.3 6.7 7.2
[127] 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8
[145] 6.7 6.7 6.3 6.5 6.2 5.9
  • これを実行すると、負荷がかかってるのがわかる
x <- rcn$eval("for( i in 1:5000 ) x<- matrix(0.3,10000,10)")

コメント