からRPy2をインストールした後
http://rpy.sourceforge.net/rpy2.html
Python 2.6 IDLEで使用しようとしていますが、次のエラーが発生します。
>>> import rpy2.robjects as robjects
>>> robjects.r['pi']
<RVector - Python:0x0121D8F0 / R:0x022A1760>
私が間違っているのは何ですか?
からRPy2をインストールした後
http://rpy.sourceforge.net/rpy2.html
Python 2.6 IDLEで使用しようとしていますが、次のエラーが発生します。
>>> import rpy2.robjects as robjects
>>> robjects.r['pi']
<RVector - Python:0x0121D8F0 / R:0x022A1760>
私が間違っているのは何ですか?
返されたベクトルを見てみましたか?
>>> pi = robjects.r['pi']
>>> pi[0]
3.14159265358979
シェーンの答えを拡張する。rpy2は、次のPythonオブジェクトを使用して、基本的なRタイプを表します。
基本的なPythonタイプに強制的に戻すには、ここを参照してください。
例として、これを使用してRリストをpythondictに変換します。
rList = ro.r('''list(name1=1,name2=c(1,2,3))''')
pyDict = {}
for name,value in zip([i for i in rList.getnames()],[i for i in rList]):
if len(value) == 1: pyDict[name] = value[0]
else: pyDict[name] = [i for i in value]
Pythonインタラクティブインタープリターでは、式が値を返す場合、その値が自動的に出力されます。たとえば、辞書を作成してそこから値を抽出すると、値が自動的に出力されますが、これが実行中のスクリプトにある場合は、そうではありません。次の簡単な例を見てください。これはエラーではなく、式の結果をPythonで出力するだけです。
>>> mymap = {"a":23}
>>> mymap["a"]
23
Pythonスクリプトの同じコードでは、出力がまったく生成されません。
コードでは、次のコードを使用して構造のようなマップにアクセスしています。
>>> robjects.r['pi']
これは、デフォルトの文字列表現が次のR2Pyオブジェクトを返します。<RVector - Python:0x0121D8F0 / R:0x022A1760>
コードを次のようなものに変更した場合:
pi = robjects.r['pi']
出力は表示されませんが、呼び出しの結果(ベクトル)が変数に割り当てられ、pi
使用できるようになります。
R2Pyのドキュメントを見ると、オブジェクトの多くはデフォルトで<>括弧内のタイプといくつかのメモリアドレス情報として印刷されているようです。
これはエラーではなく、返されたrobjectの「repr」にすぎません。
>>> r['pi']
<RVector - Python:0x2c14bd8 / R:0x3719538>
>>> repr(r['pi'])
'<RVector - Python:0x4b77908 / R:0x3719538>'
>>> str(r['pi'])
'[1] 3.141593'
>>> print r['pi']
[1] 3.141593
インデックスでアクセスする'pi'の値を取得できます
>>> r['pi'][0]
3.1415926535897931
名前付きリストの要素にアクセスするには(' object $ attribute ' R構文)
>>> l = r.list(a=r.c(1,2,3), b=r.c(4,5,6))
>>> print l
$a
[1] 1 2 3
$b
[1] 4 5 6
>>> print dict(zip(l.names, l))['a']
[1] 1 2 3
しかし、私はもっと良い解決策があるに違いないと思います...
これは、RオブジェクトとPythonを行き来する方法についての唯一の賢明で短い議論であることがわかりました。naufraghiのソリューションは、data.frameを変換するための次のアプローチを促しました。これにより、データフレームのより優れたスライス機能が保持されます。
In [69]: import numpy as np
In [70]: import rpy2.robjects as ro
In [71]: df = ro.r['data.frame'](a=r.c(1,2,3), b=r.c(4.0,5.0,6.3))
In [72]: df
Out[72]: <RDataFrame - Python:0x5492200 / R:0x4d00a28>
In [73]: print(df)
a b
1 1 4.0
2 2 5.0
3 3 6.3
In [74]: recdf = np.rec.fromarrays(df, names=tuple(df.names))
In [75]: recdf
Out[75]:
rec.array([(1, 4.0), (2, 5.0), (3, 6.2999999999999998)],
dtype=[('a', '<i4'), ('b', '<f8')])
この時点では少し話題から外れているようですが、この質問と回答を取得するための適切な手順がわかりません。