2

からRPy2をインストールした後

http://rpy.sourceforge.net/rpy2.html

Python 2.6 IDLEで使用しようとしていますが、次のエラーが発生します。

>>> import rpy2.robjects as robjects
>>> robjects.r['pi']

<RVector - Python:0x0121D8F0 / R:0x022A1760>

私が間違っているのは何ですか?

4

5 に答える 5

8

返されたベクトルを見てみましたか?

 >>> pi = robjects.r['pi']
 >>> pi[0]
 3.14159265358979
于 2009-10-30T15:06:09.313 に答える
5

シェーンの答えを拡張する。rpy2は、次のPythonオブジェクトを使用して、基本的なRタイプを表します。

  • RVector:Rスカラーとベクトル、Rリストは名前付きのRVectorとして表されます。以下を参照してください。
  • RArray:R行列、本質的に次元を持つRVector
  • RDataFrame:R data.frame

基本的な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]
于 2009-10-30T17:15:40.910 に答える
1

Pythonインタラクティブインタープリターでは、式が値を返す場合、その値が自動的に出力されます。たとえば、辞書を作成してそこから値を抽出すると、値が自動的に出力されますが、これが実行中のスクリプトにある場合は、そうではありません。次の簡単な例を見てください。これはエラーではなく、式の結果をPythonで出力するだけです。

>>> mymap = {"a":23}
>>> mymap["a"]
23

Pythonスクリプトの同じコードでは、出力がまったく生成されません。

コードでは、次のコードを使用して構造のようなマップにアクセスしています。

>>> robjects.r['pi']

これは、デフォルトの文字列表現が次のR2Pyオブジェクトを返します。<RVector - Python:0x0121D8F0 / R:0x022A1760>

コードを次のようなものに変更した場合:

pi = robjects.r['pi']

出力は表示されませんが、呼び出しの結果(ベクトル)が変数に割り当てられ、pi使用できるようになります。

R2Pyのドキュメントを見ると、オブジェクトの多くはデフォルトで<>括弧内のタイプといくつかのメモリアドレス情報として印刷されているようです。

于 2009-10-30T14:58:01.843 に答える
1

これはエラーではなく、返された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

しかし、私はもっと良い解決策があるに違いないと思います...

于 2010-04-15T13:32:34.093 に答える
0

これは、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')])

この時点では少し話題から外れているようですが、この質問と回答を取得するための適切な手順がわかりません。

于 2010-10-07T03:52:38.550 に答える