PythonからRを使う

Python から R を使うには PypeR(パイパー)というライブラリが便利です(ほかに rpy2 というライブラリもあります)。PypeR は pip install pyper でインストールできます。

In [ ]: import pyper

In [ ]: r = pyper.R()  # Rのインスタンスを作る

In [ ]: r('sin(pi/4)') # Rにコマンドを送る(出力が見にくい)
Out[ ]: 'try({sin(pi/4)})\n[1] 0.7071068\n'

In [ ]: print(r('sin(pi/4)'))  # これのほうが見やすい
try({sin(pi/4)})
[1] 0.7071068


In [ ]: r.assign('x', [i for i in range(10)]) # Rのオブジェクトに代入

In [ ]: print(r('x^2'))
try({x^2})
 [1]  0  1  4  9 16 25 36 49 64 81


In [ ]: r('y = x^2')
Out[ ]: 'try({y = x^2})\n'

In [ ]: r.get('y')  # RのオブジェクトをPythonに持ってくる
Out[ ]: array([ 0,  1,  4,  9, 16, 25, 36, 49, 64, 81])

In [ ]: r("curve(x^2, -2, 2)")  # これでは表示できない
Out[ ]: 'try({curve(x^2, -2, 2)})\n'

In [ ]: r('png("hoge.png"); curve(x^2, -2, 2); dev.off()')  # 画像ファイル出力
Out[ ]: 'try({png("hoge.png"); curve(x^2, -2, 2); dev.off()})\npdf \n  2 \n'

In [ ]: !open hoge.png  # Macならこれで画像ファイルを表示できる

Jupyter Notebook なら次のようにすればカレントディレクトリの画像ファイルをブラウザにインライン表示できます:

from IPython.display import Image

Image('hoge.png')

逆に R から Python を使うには reticulate パッケージを使います。

R で reticulate を使って R のオブジェクトを Python の npy 形式または npz 形式で保存することができます(参考:Using reticulate to read and write NumPy files):

library(reticulate)

np = import("numpy")
np$savez("data.npz", x=x, y=y)

Python 側での読み込みは次の通りです:

import numpy as np

data = np.load("data.npz")
data.files   # ['y', 'x']
data['x']
data['y']

逆に Python からの保存:

np.savez("data.npz", x=x, y=y)

R での読み込み:

data = np$load("data.npz")
data["files"]  # "y" "x"
data["x"]
data["y"]

Last modified: