rpy2とsoaplibでつくるRのウェブサービス
soaplibにはCherryPyが組み込まれているので簡単にウェブサービスがつくれる。さらにrpy2を使えばRのウェブサービスがお手軽に構築できて便利。
以下のコードをsoapr.pyというファイル名で保存する。これは与えた数字の数だけRがrnormして返すという簡単なサービス。
from soaplib.wsgi_soap import SimpleWSGISoapApp
from soaplib.service import soapmethod
from soaplib.serializers.primitive import String, Integer, Array, Float
import rpy2.robjects as robjects
class RService(SimpleWSGISoapApp):
@soapmethod(Integer,_returns=Array(Float))
def rnorm(self,num):
r = robjects.r
y = r.rnorm(num)
return [i for i in y]
if __name__=='__main__':
from cherrypy.wsgiserver import CherryPyWSGIServer
server = CherryPyWSGIServer(('localhost',7789),RService())
server.start()
実行するとサーバが立ち上がりhttp://localhost:7789/soapr.wsdlにアクセスするとwsdlを出力する。
テスト用のクライアント
>>> from soaplib.client import make_service_client
>>> from soapr import RService
>>> client = make_service_client('http://localhost:7789/',RService())
>>> print client.rnorm(5)
[-0.40538156526399999, 0.45889158855099998, -0.67243766066699995, 2.6881017757299999, 0.113257266309]
>>> print client.rnorm(3)
[-0.16610789340500001, 0.66591497139099998, -1.74812066455]
参考
macbookでRpyを利用できるようにしたのでメモ
python2.5,R-2.7.1,rpy1.0.3という組み合わせで。rpy2-alphaはコンパイルが通らなかった。
Rのインストール
Rはソースからコンパイル。enable-R-shlibオプションをつけるのを忘れずに、というより配布されていたバイナリはこれつきでコンパイルされてないようなのでそのままではrpyが入らないはず。
R CMD config --ldflags
とか打つとOKかどうかわかる。 ダメげな場合は潔くソースから。
./configure --enable-R-shlib
make
ここでまた、make installするとshlibがなんかみつからなくなるという現象に悩まされた。そのため、ユーザー領域でコンパイルしたバイナリを使う事にした。/Users/kzfm/R-2.7.1/bin/Rが実体で/opt/local/bin/Rにシンボリックリンクを張って使っている。
Rpyのインストール
export R_HOME=/Users/kzfm/R-2.7.1
export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:$R_HOME/lib
これが重要。あとmacのgccでもコンパイルできなくてmacportのgcc使ってコンパイルする必要があるかもしれない。
あとは普通に
sudo python setup.py install
でいけるはず。
WindowsでRPyを使う
普段はLinuxマシンでRPyを使うのだけど、手元のLet's NoteR4でも使いたいので。
- R2.6.1
- Python2.5.1
- RPy1.0.1
- pywin32 build210
pywinはeasy_installで。普通にダウンロードしてクリックからのインストールでもいいような。
easy_install pywin32
RPyはrpy-1.0.1-R-1.3.0-to-2.6.1-Numpy-win32-py2.5.exeを落としてきて入れた。
あと環境変数。R_HOMEがねーとかwin32allがimport出来ないとかいうエラーは環境変数の設定のせい。次の二つを環境変数Pathにセットしておくととりあえず大丈夫。
C:\Program Files\R\R-2.6.1\bin
C:\Python25\Lib\site-packages\pywin32-210-py2.5-win32.egg\pywin32_system32
後者のほうはなんとかならんかね。Pathに設定するようなもんじゃないと思うんだけど。前者もpathでなくてR_HOMEとかにセットできたらいいのにね。


