Pythonプログラム内からRにアクセスしたいと思います。私はRpy2、pyrserve、PypeRを知っています。
これらの3つのオプションの長所または短所は何ですか?
私は3つのうちの1つを他のものよりよく知っていますが、質問で与えられた順序で:
rpy2:
パイサーブ:
パイパー:
編集: rpy2のWindowsサポート
Journal of Statistics Software on PypeRの論文から:
RPyは、PythonからRにアクセスするためのシンプルで効率的な方法を提供します。これは堅牢で、PythonとRの間の頻繁な対話操作に非常に便利です。このパッケージを使用すると、Pythonプログラムで基本データ型のPythonオブジェクトをR関数に渡し、結果をPythonオブジェクトで返すことができます。このような機能は、PythonとRが頻繁に相互作用する場合に魅力的なソリューションになります。ただし、以下に示すように、このパッケージにはまだ制限があります。
パフォーマンス:
RPyは、大規模なデータセットや計算量の多いタスクではうまく動作しない可能性があります。会話のすべてのラウンドでRPyがR式の戻り値を基本型のPythonオブジェクトまたはNumPy配列に変換するため、RデータのPythonコピーを作成する際に多くの時間とメモリが必然的に消費されます。最近開発されたRPyのブランチであるRPy2は、PythonオブジェクトをPythonオブジェクトにコピーして戻すのではなく、Pythonオブジェクトを使用してRオブジェクトを参照します。この戦略により、頻繁なデータ変換が回避され、速度が向上します。ただし、メモリ消費は依然として問題です。[...]マイクロアレイデータ分析用のオンラインプラットフォームであるWebArray(Xia et al。2005)を実装していたとき、RのコマンドラインユーザーインターフェイスではなくRPyを介してRを実行すると、ジョブの計算時間が約4分の1長くなりました。したがって、その後の開発では、Rを独立して実行した場合と同じパフォーマンスを維持するWebArrayDB(Xia et al。2009)などのパイプを介してPythonでRを実行することにしました。このようなパフォーマンスの違いの正確な理由はわかりませんが、RPyがRの共有ライブラリを直接使用してRスクリプトを実行していることに気付きました。対照的に、パイプを介してRを実行することは、Rインタープリターを直接実行することを意味します。
メモリ:
Rは、メモリの不経済な使用で非難されています。大きなサイズのRオブジェクトが使用していたメモリは、これらのオブジェクトが削除された後に解放されることはめったにありません。Rからメモリを解放する唯一の方法は、Rを終了することである場合があります。RPyモジュールは、RをPythonオブジェクトでラップします。ただし、Pythonオブジェクトが削除されても、Rライブラリはメモリに残ります。つまり、ホストPythonスクリプトが終了するまで、Rによって使用されているメモリを解放することはできません。
移植性:
拡張機能がCで記述されたモジュールとして、RPyソースパッケージはPOSIX(Unix用のポータブルオペレーティングシステムインターフェイス)システムで特定のRバージョンでコンパイルする必要があり、Rは共有ライブラリを有効にしてコンパイルする必要があります。また、Windowsのバイナリディストリビューションは、Python / Rのさまざまなバージョンの特定の組み合わせにバインドされているため、ユーザーがユーザーのソフトウェア環境に合ったディストリビューションを見つけるのが難しいことがよくあります。
pyperでは、assign()を使用してPythonからrインスタンスに大きな行列を渡すことはできません。ただし、rpy2には問題はありません。それは私の経験です。
開発者の見通しから、私たちはrpy / rpy2を使用して、Pythonベースのアプリケーションに統計関数と描画関数を提供していました。rpy / rpy2はPythonとRの特定の組み合わせ用にコンパイルする必要があるため、アプリケーションの配信に大きな問題が発生しました。これにより、Rもバンドルしない限り、すぐに機能するバイナリディストリビューションを提供できなくなります。rpy / rpy2のインストールは特に簡単ではないため、関連するパーツをmatplotlibなどのネイティブPythonモジュールに置き換えることになりました。Rをローカルで起動し、Rのバージョンを気にせずに接続できるため、Rを使用する必要がある場合はpyrserveに切り替えていたはずです。