2016-07-22 11 views
0

こんにちは、次の行を実行し、少し驚いた。混乱インライン:スコープ/パラメータ渡しの混乱R

[OK]をので、私はリストを作成します。

> x<-list() 

は、私がXに

あるものを見るように頼む ""

> x$a<-1 

でインデックス化要素である1を割り当てます

> x 
$a 
[1] 1 

これまでのように良い

次の私はそれに渡されたリストがかかりますし、インデックスへの代入のように「」私はちょうど私がXで関数を呼び出す2

> foo<-function(xx) { 
+ xx["b"]<-2 
+ print(xx) 
+ } 

インデックス「B」の値に割り当てます関数を宣言 - 私は私が見るものが好き 今、私の考えは、リストオブジェクトは、(あなたが& Xを行う際にCのように参照することによって)渡されました、それは破壊的に私はXの印刷機能の本体の外に今

> foo(x) 
$a 
[1] 1 

$b 
[1] 2 

に変更されたということです - しかし見ることに驚いたb

> x 
$a 
[1] 1 

> 

私は汲み取りとパラメータ渡しのドキュメントを読みましたが、これを理解できませんでした。関数本体が呼び出される前にリストが深くまたは浅くコピーされていますか?

+2

あなたは 'assign'か' x < - foo(x) ' – akrun

+0

のどちらかを使う必要があります。そうすれば、変更されたリストを返してそれを再割り当てする必要があると言います。私はグラフウォーカーを書いているので、エレガントな解決策ではありません...私は割り当てを見てみましょう。もう一度おねがいします – user975917

+2

'私の考えは、リストオブジェクトが(Cのように参照によって)渡されたことです。初めて私はCが参照渡しを聞いた。ところで、Rは*機能*プログラミング言語です。関数の引数はコピーされ、その変更は関数スコープ外には保持されません。 – nicola

答えて

1

から[1]:R引数で関数を呼び出す

セマンティクスは、コールによって値です。

これは、引数が呼び出しフレームで評価され、関数評価環境に深くコピーされることを意味します。 (唯一の例外は、さらに詳しくは、[1]のデフォルトパラメータを参照している。)

[1] https://cran.r-project.org/doc/manuals/r-release/R-lang.html#Argument-evaluation

1

This questionはRのコピー・オン・修正詳細にメカニズムを説明し、 Hadleyの関数hereの説明には、あなたのものによく似た例が含まれています(「戻り値」セクションを参照)。簡単な要約は、概念的には(ユーザーの視点から見ると)、R は常にで、パラメータは値になります。その背後では、通訳者はそれが安全であることを推測できればこれを避けるかもしれないが、アプリケーションプログラマは何も仮定することはできません。