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]
参考