2011-11-21 3 views
10

私はRプログラミング言語の基本的な概念を頭に入れようとしています.Rは汎用プログラミングの代わりに統計に向けられているので、難しいと感じています。私はポインタ/参照に似た何かを見つけることができません。 R言語内でリンクリスト、検索ツリーなどをどのように実装しますか?Rで自分のリンクリスト/ツリーをロールする?

注:Rで実際に自己参照データ構造を使用している場合は、達成しようとしていることを達成するためのより良い方法があると思います。しかし、私は答えが私が言語の全体的な構造と概念をよりよく理解するのに役立つと信じています。

編集:マットShotwellさんのコメントに関しては、この質問のポイントは、私が R内ではなく、Cまたは他の言語で書かれた拡張機能として、きれいにリンクされたリストや木を書くことを探していますということです。それを拡張子として、あるいは通訳者の秘密の細部と一緒にして、その目的を破る。

+0

ここでは、1)?parilist 2) 'R Internals'マニュアルと 'Writing R Extensions'マニュアルで 'weak reference'と 'external pointer'を検索してください。 –

答えて

15

Rのリンクリストは、ベクトルとして表すことができます。通常、listです。次のアイテムと前のアイテムを参照するための特別なコードを書く必要はありません。これは、Rがインデックス作成のために行うためです。

リストに新しい項目を追加するには、その長さを追跡し、次の行に割り当てます。

lst <- list() # creates an empty (length zero) list 
lst[[1]] <- 1 # automagically extends the lst 
lst[[2]] <- 2 # ditto 

これは、Rがメモリを扱う方法のために、長いリストでは効率が悪いことがあります。可能であれば、事前にリストを作成し、利用可能になったときにその内容を割り当てます。

リストから項目を削除
lst <- list(1, 2, 3, 4, 5) # a list of 5 items 

lst <- vector("list", 10000) # 10000 NULLs 
lst[[1]] <- 1 
lst[[10000]] <- 10000 # lst now contains 1, NULL, ..., NULL, 10000 

は負のインデックスを用いて達成することができます。

lst <- list(1, 2, 3, 4, 5) 
lst <- lst[-2] # now contains 1, 3, 4, 5 

ツリーは他のリストを含む単なるリストです。

tree <- list(list(1, 2), list(3, list(4, 5))) 

# left child: list(1, 2) 
tree[[1]] 

# right child 
tree[[2]] 

# right child of right child:list(4, 5) 
tree[[2]][[2]] 

デフォルトでは、構造体には強制的な強制はありません。たとえば、バイナリツリーのノードあたり2つのみの子があります。より構造化されたアプローチはS4クラスを介して利用可能ですが、これはピンチで仕事をします。

+1

+1非常に良い答えです。 – Iterator

+3

内部レベルでは、 'list'はただの型のベクトルです。 'pairlist'は本当のリンクリストです。 –

+0

@ジョシュア:本当ですが、リンクされたリストを望むほとんどのものでは、通常の 'list'はうまく動作し、特にRの新しい誰かのためにあいまいさが少なくなります。 –