2012-12-18 7 views
9

私はPythonのリストや辞書、PHPの連想配列(基本的にハッシュテーブル)、C++のベクトルなど、経験豊富な一般的な言語で使用されているさまざまなデータ構造について学んでいます。ベクトル、行列、データフレームはどのようにRで実装されていますか?

私はRを宗教的に使用する多くの同僚を抱えており、ベクトル、行列、データフレームがどのようにRに実装されているのか疑問に思っていました。彼らの長所と短所は何ですか?私はソースコードを見ていましたが、データ構造自体は見つかりませんでした。これらの定義はソースコードのどこにありますか?

+0

http://cran.r-project.org/doc/manuals/r-release/R-lang.htmlは役に立ちますか? (必ずしもそうではありません:データ構造がどのように*定義されていて、どのように実装されているかはわかりませんが...) –

+7

'$ R_SRC_HOME/src/main /'では 'built_c'に' do_makevector'を、 'array.c'には' do_matrix'を探します。 data.framesは単に 'data.frame'クラスのリストなので、' do_makelist'( 'builtin.c'でもあります)を見て、次にRで' data.frame'とタイプして返されたRコードコンソール。大きな画像については、Rのマニュアルが役立つかもしれません:リンクされている@BenBolkerと["R-internals"](http://cran.r-project.org/doc/manuals/R-ints)を参照してください。 .html)マニュアル。 –

+0

@ JoshO'Brienこれは答えではなく、コメントではない(事前に+1)。 –

答えて

1

は、1.1 SEXPs:

は... Rオブジェクトの基本的なビルディングブロックは、多くの場合、ノードと呼ばれ...ノード構造の両方のタイプは、その最初の3つのフィールドの32ビットとして持つspxinfo (アトリビュートと二重リンクリストの前後のノードに)

したがって、Rのベクトルは二重リンクリストとして実装されています。さらに、単一ノードのリンクされたリストよりも小さいデータ構造は存在しないように見えます。他の人が述べたように

> a <- 4 
> a[1] 
4 

builtin.cdo_makevectordo_makelistを有し、array.cdo_matrixのソースを有し、これはによって明らかです。加えて、array.callocMatrixのソースを含み、memory.callocVectorのソースを含んでいます。

多くのことが私の頭の中にありましたが、マトリックスは単なる二重にリンクされたリストの二重リンクのリストであることが明らかです。私は確信していますが、行と列の名前(データフレームに格納されているものなど)は各リストの '属性'に格納されています。

データ構造の実装の「長所と短所」に対する応答は、(私の限られた知識から)二重にリンクされたリストは、動的メモリ割り当てがより簡単であり、配列全体のコピーと再割り当てのオーバーヘッドと、ランダム値にアクセスする弱点(リストに含まれるポインタの数に応じて、頭、尾、中、四半期など)が複数回繰り返すオーバーヘッドを取ることがあります所望のものの前の要素が見つかる。

これは間違いありませんか?

0

少し遅れましたが、他の回答と間違いを指摘して明示的な回答をしたかったのです。内部マニュアルを見てください:

https://cran.r-project.org/doc/manuals/R-ints.html#The-_0027data_0027

このセクション、および「INTSXP」のエントリの始まりをお読みください。整数ベクトルはC intの配列として実装されているようです。 'REALSXP'と 'CHARSXP'の場合も同様です。

リンクリストとして実装するのは非常に遅いです。

関連する問題