2011-10-19 7 views
3

私は今日リストのリストを使っていて、2番目のレベルのリストの1つの要素を置き換える必要がありました。これを行う方法は明白でしたが、なぜそれが効果的であるかについてはっきりしていないことに気付きました。このデータ構造を考えるとネストされた置換演算子はどのように機能しますか?

a <- list(aa=list(aaa=1:10,bbb=11:20,ccc=21:30),bb=list(ddd=1:5)) 

、のは、私は、ネストされた数値ベクトルのAAAの第三の要素を交換したいとしましょう:

は、ここでの例です。

newvalue <- 100 
a$aa$aaa[3] <- newvalue 

これを行うことは明らかですが、この表現がどのように評価されるのか自分自身に説明することはできませんでした。 (1)トップレベル関数呼び出しを作成し、提出する

:引用機能での作業、私はの線に沿って、一緒にいくつかの大まかなロジックを石畳

`<-`(a$aa$aaa[3],newvalue) 

(2)最初の引数の遅延評価を(1)、通話機能に '[':

`[`(a$aa$aaa,3)  

(3)recursivleyダウン進み:

`$`(a$aa,"aaa") 

(4)...ダウンさらに、再び「$」を呼び出します。

`$`(a,"aa") 

(5)(4)実際のデータ構造を返すと、「スタックアップ」バック進むまで、返されたデータ構造を代入実際の割り当ては(1)で行われます。

私の混乱は、怠惰な評価や評価環境のいくつかの側面が関係していると思います。上記の例では、ベクトルの1つの要素を単純に再割り当てしました。しかし、Rはそのベクトルがより大きなデータ構造のどこにあるのかを把握していますか?

乾杯

+2

私はこのことが不思議です[回答](http://stackoverflow.com/questions/6437769/why-does-item-assignment-in-non-existant-data-frame-column-work/6440706#6440706)助けて? –

答えて

1

は私が続いa$aa$aaa[3]作品として考える:

あなたは、単一の角括弧を使用して、現在のオブジェクト、[]内まだ要素にアクセスしたいときに。これにより、要素がアクセシブルになりますが、要素が依然としてオブジェクトの一部であるため、複雑な操作を実行することはできません。

$を使用して要素にアクセスすると、a$aaからa[["aa"]]に変換され、現在のオブジェクトから要素が解放されます。

合計式a$aa$aaa[3]a[["aa"]][["aaa"]][3]に変換されます。これは、ベクトルのベクトルとして扱われる - >

  1. テイクオブジェクトa、アクセスベクタaa
  2. アクセスベクターaaa
  3. ベクトルaaaの3番目の要素にアクセスします。

R評価:

> a 
$aa 
$aa$aaa 
[1] 1 2 3 4 5 6 7 8 9 10 

$aa$bbb 
[1] 11 12 13 14 15 16 17 18 19 20 

$aa$ccc 
[1] 21 22 23 24 25 26 27 28 29 30 


$bb 
$bb$ddd 
[1] 1 2 3 4 5 


> a$aa 
$aaa 
[1] 1 2 3 4 5 6 7 8 9 10 

$bbb 
[1] 11 12 13 14 15 16 17 18 19 20 

$ccc 
[1] 21 22 23 24 25 26 27 28 29 30 

> a$aa$aaa 
[1] 1 2 3 4 5 6 7 8 9 10 
> a[["aa"]] 
$aaa 
[1] 1 2 3 4 5 6 7 8 9 10 

$bbb 
[1] 11 12 13 14 15 16 17 18 19 20 

$ccc 
[1] 21 22 23 24 25 26 27 28 29 30 

> a[["aa"]][["aaa"]] 
[1] 1 2 3 4 5 6 7 8 9 10 
> a["aa"] 
$aa 
$aa$aaa 
[1] 1 2 3 4 5 6 7 8 9 10 

$aa$bbb 
[1] 11 12 13 14 15 16 17 18 19 20 

$aa$ccc 
[1] 21 22 23 24 25 26 27 28 29 30 


> a["aa"]["aaa"] 
$<NA> 
NULL 

・ホープ、このことができます。

関連する問題