web-dev-qa-db-ja.com

Rpy2、pyrserve、およびPypeRはどのように比較されますか?

Pythonプログラム内からRにアクセスしたいと思っています。Rpy2、pyrserve、PypeRを知っています。

これらの3つのオプションの長所と短所は何ですか?

58
DanB

私は3つのうちの1つを他のものよりもよく知っていますが、質問で与えられた順序で:

rpy2:

  • PythonとRの間のCレベルのインターフェース(Rは埋め込みプロセスとして実行)
  • Pythonに公開されたRオブジェクト。データをコピーする必要はありません。
  • 逆に、Pythonのnumpy配列はコピーを作成せずにRに公開できます
  • 低レベルのインターフェース(R C-APIに近い)と高レベルのインターフェース(便宜上)
  • ベクトルと配列のインプレース変更が可能
  • Rコールバック関数はPythonで実装できます
  • Pythonラベルの付いた匿名のRオブジェクトを持つことが可能
  • Pythonの酸洗いが可能
  • コンソールを使用したRの動作の完全なカスタマイズ(完全なR GUIを実装することも可能)
  • サポートが制限されたMSWindows

パイサーブ:

  • ネイティブPythonコード(CPython、Jython、IronPythonで動作する/する/する必要があります)
  • rのRserveを使用する
  • リモート計算とRServeにリンクされた利点と不便さ

パイパー:

  • ネイティブPythonコード(CPython、Jython、IronPythonで動作する/する/する必要があります)
  • パイプを使用してPython Rと通信する(それに関連する利点と不便さを伴う)

編集: rpy2のWindowsサポート

36
lgautier

Journal of Statistical Software on PypeR の論文より:

RPyは、PythonからRにアクセスする簡単で効率的な方法を提供します。これは堅牢で、PythonとRの間の頻繁な対話操作に非常に便利です。このパッケージにより、Pythonプログラムにパスを渡すことができますPython基本的なデータ型のオブジェクトをR関数に返し、結果をPythonオブジェクトで返します。このような機能により、PythonとRが相互作用する場合の魅力的なソリューションになります。ただし、以下に示すように、このパッケージにはまだ制限があります。
パフォーマンス:
RPyは、大規模なデータセットや計算を多用する作業ではあまりうまく動作しない場合があります。 Python Rデータのコピーの作成には、多くの時間とメモリが必然的に消費されます。会話のすべてのラウンドで、RPyはR式の戻り値をPython基本タイプのオブジェクトまたはNumPy配列。RPyの最近開発されたブランチであるRPy2は、Pythonオブジェクトを使用して、RオブジェクトをPythonオブジェクト。この戦略により、頻繁なデータ変換が回避され、速度が向上します。ただし、メモリの消費には問題があります。[...]マイクロアレイデータ分析のオンラインプラットフォームであるWebArray(Xia et al。2005)を実装していたとき、RのコマンドラインユーザーインターフェイスではなくRPyを介してRを実行すると、ジョブは約4分の1の計算時間を消費しました。したがって、RをPython以降の開発ではパイプを介して実行します。 、WebArrayDB(Xia et al。2009)。Rを独立して実行した場合と同じパフォーマンスを維持しました。正確な理由はわかりません。パフォーマンスのこのような違いのためにオンにしましたが、RPyはRの共有ライブラリを直接使用してRスクリプトを実行していることに気付きました。対照的に、パイプを介してRを実行するとは、Rインタープリターを直接実行することを意味します。
メモリ:
Rはメモリの不経済な使用により非難されました。ラージサイズのRオブジェクトが使用するメモリは、これらのオブジェクトが削除された後に解放されることはほとんどありません。 Rからメモリを解放する唯一の方法は、Rを終了することです。RPyモジュールはRをPythonオブジェクトでラップします。ただし、R =ライブラリはPythonオブジェクトは削除されます。つまり、Rが使用していたメモリは、ホストPythonスクリプトが終了するまで解放されません。
移植性:
Cで書かれた拡張機能を持つモジュールとして、RPyソースパッケージは、POSIX(Unixのポータブルオペレーティングシステムインターフェイス)システムの特定のRバージョンでコンパイルする必要があり、Rは共有ライブラリを有効にしてコンパイルする必要があります。また、Windowsのバイナリディストリビューションは、Python/Rの異なるバージョンの特定の組み合わせにバインドされているため、ユーザーが自分のソフトウェア環境を使用するディストリビューションを見つけるのが難しい場合がよくあります。

16
Henrik

開発者の見込みから、Pythonベースのアプリケーションに統計関数と描画関数を提供するためにrpy/rpy2を使用していました。 PythonとRの特定の組み合わせに対してrpy/rpy2をコンパイルする必要があるため、アプリケーションの配信に大きな問題が発生しました。 Rもバンドルしています。rpy/ rpy2はインストールが特に簡単ではないため、関連するパーツをネイティブのPythonモジュール(matplotlibなど)に置き換えることになります。 Rサーバーをローカルで起動し、Rのバージョンを気にすることなくそれに接続できるため、Rを使用します。

4
user2283347

pyperでは、pythonからassign()を使用してrインスタンスに大きな行列を渡すことはできませんが、rpy2には問題がありません。これは私の経験です。

4
statcompute