2010-10-13 Javaで統計解析器Rを使う
ライブラリを使わずにJavaからRを使う
ライブラリの中を理解するのが大変そうなので、
というわけで、やってみた。
環境
Netbeans 6.8
コード
help()コマンドを実行した時の出力を受け取る。
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; /** * * @author Syu_Syu */ public class Rcmd { public String commander()throws IOException { String result = new String(); ProcessBuilder builder = new ProcessBuilder("/usr/bin/R","-q","--no-save"); Process process = builder.start(); OutputStream os = process.getOutputStream(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os)); bw.write("help()"); bw.flush(); bw.close(); InputStream is = process.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line_tmp = new String(); String line = new String(); while((line_tmp = br.readLine()) != null){ line += line_tmp +"\n"; System.out.println(line_tmp); } br.close(); InputStream stream = process.getErrorStream(); while(true){ int c = stream.read(); if(c == -1){ stream.close(); break; } System.out.print((char)c); } result = line; return result; } }
ライセンス表示の省略
Rを起動すると以下の文章が表示される。
R version 2.10.1 (2009-12-14) Copyright (C) 2009 The R Foundation for Statistical Computing ISBN 3-900051-07-0 Rは、自由なソフトウェアであり、「完全に無保証」です。 一定の条件に従えば、自由にこれを再配布することができます。 配布条件の詳細に関しては、'license()'あるいは'licence()'と入力してください。 Rは多くの貢献者による共同プロジェクトです。 詳しくは'contributors()'と入力してください。 また、RやRのパッケージを出版物で引用する際の形式については 'citation()'と入力してください。 'demo()'と入力すればデモをみることができます。 'help()'とすればオンラインヘルプが出ます。 'help.start()'でHTMLブラウザによるヘルプがみられます。 'q()'と入力すればRを終了します。
標準出力をStringで取ってきているので、この文章も取ってきてしまう。
そこで、非表示にするオプションを使う。
ProcessBuilder builder = new ProcessBuilder("/usr/bin/R","-q","--no-save");
この"-q","--no-save"がオプション。
-qでライセンスを非表示にできる。
--no-saveで実行したRを保存しない設定にしている。
複数のコマンド入力
以下のコードでhelp()コマンドを入力している。
bw.write("help()");
bw.flush();
bw.close();
例えば、続けてgetwd()コマンドを入力したい時は、以下のようにする。
bw.write("help()\n"); bw.flush(); bw.write("getwd()"); bw.flush(); bw.close();
または、以下のように、\nで繋げて書いても良い。
bw.write("help()\ngetwd()"); bw.flush(); bw.close();
エラー処理は必須
以下のコードは、エラー処理として絶対に必要。
InputStream stream = process.getErrorStream(); while(true){ int c = stream.read(); if(c == -1){ stream.close(); break; } System.out.print((char)c); }
このエラー処理がないと、うまく動かない。
おわり
取ってきたStringは、以下のようにコマンドも出力されている。
> getwd() [1] "/home/username/NetBeansProjects/projectname" >
そのため、別のプログラムで必要な部分だけ抽出してやる必要がある。
- 75 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4SUNC_jaJP401JP401&q=java+tryにwhileは入らない
- 30 http://www.google.co.jp/url?sa=t&source=web&cd=1&ved=0CBkQFjAA&url=http://d.hatena.ne.jp/Syu-syu/20100429/1272530897&rct=j&q=.readLine()!=null){&ei=CvCwTcbgDI24vgPHm8mJBw&usg=AFQjCNEy-hQi2vatMj3T4B63Iq-nyG2Ccg
- 29 http://twitter.com/
- 26 http://www.google.co.jp/search?hl=ja&lr=lang_ja&tbs=lr:lang_1ja&q=(str+=+br.readLine())+!=+null&aq=f&aqi=&aql=&oq=&gs_rfai=
- 23 http://www.google.co.jp/search?q=AllayList&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja-JP-mac:official&hl=ja&client=firefox-a
- 23 http://www.google.co.jp/url?sa=t&source=web&cd=1&ved=0CBgQFjAA&url=http://d.hatena.ne.jp/Syu-syu/20100429/1272530897&rct=j&q=java readline 終了条件&ei=HaJGTe-lJcbQcbrwrKIO&usg=AFQjCNEy-hQi2vatMj3T4B63Iq-nyG2Ccg
- 20 http://pipes.yahoo.com/pipes/pipe.info?_id=tDfBdGWF3RGl9XNm1L3fcQ
- 20 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&q=ubuntu10+windows+共有&aq=f&aqi=g-c1g1&aql=&oq=&gs_rfai=
- 20 http://www.google.co.jp/url?sa=t&source=web&cd=1&ved=0CBwQFjAA&url=http://d.hatena.ne.jp/Syu-syu/20100418/1271556503&rct=j&q=allaylist&ei=XzuUTaGkHsLBcZS5uKQH&usg=AFQjCNFY7niNQV6Zut1jyqok80106Jvk0A
- 18 http://www.google.co.jp/url?sa=t&source=web&cd=1&ved=0CB0QFjAA&url=http://d.hatena.ne.jp/Syu-syu/20100418/1271556503&rct=j&q=ALLAYLIST&ei=zVK2TYnLCoq4vgP0kuyiAw&usg=AFQjCNFY7niNQV6Zut1jyqok80106Jvk0A