pyperを使ってみる

  • pythonからRを動かしてその結果をpython内に取り戻すことができる
  • 参考
  • pyperパッケージをインストールして使えるようにしたうえで
  • numpyオブジェクトを使ってRのオブジェクトを取り出すようなRの動かし方を指定する
from pyper import *
r = R(use_numpy=True)
  • Rの1文コマンドを実行して、その結果を取り出す
outputs = r("a <- 3; print(a + 5)")
outputs
  • Rのコンソールに標準出力される内容を吐く
'try({a <- 3; print(a + 5)})\n[1] 8\n'
  • pythonにRオブジェクトを取り込む
x_py =r.get('a')
x_py
  • aに格納されていた 3 が取り出される
3
  • 行列も取り出せる
r("x = matrix(rnorm(20),ncol=2)")
x_py =r.get('x')
x_py
array([[ 0.48296985, -1.31237143],
       [ 0.26313735,  0.17361424],
       [-0.62325386, -1.57476065],
       [-2.2620153 ,  1.83864163],
       [ 1.31291217,  1.59120925],
       [-1.72555325, -0.69653969],
       [ 0.94822337,  1.76162395],
       [-0.0518286 , -0.15631062],
       [ 1.58084999,  0.64470825],
       [ 2.0807602 , -0.07323586]])
  • 長いコードを与えるのは、ちょっと面倒くさい模様。改行を許さないので、";"区切りで連続書きする
rscript = "x = matrix(rnorm(210),ncol=2);"
rscript += "x = x/apply(x^2,1,sum);"
rscript += "obj = list();"
rscript += "library(onion);"
rscript += "qtn = 3+2*Hi;"
rscript += "obj[[1]] = qtn"
rscript
Out[8]:
'x = matrix(rnorm(210),ncol=2);x = x/apply(x^2,1,sum);obj = list();library(onion);qtn = 3+2*Hi;obj[[1]] = qtn'
  • 取り出そう
r("x = " +rscript)
x_py =r.get('obj[[1]]')
x_py
array([[3],
       [2],
       [0],
       [0]])