2017-03-01 16 views
1

誰でもこのコードで間違っていることを私に説明することはできますか?私は私がここでやっていると思ったことは、グローバル変数a=5 再帰的なデフォルトの引数参照

  • 前述のグローバル変数のデフォルトa
  • そして、もう一つの引数を取る関数funの定義の宣言

    • です私はローカル変数aがグローバル変数aのコピーになり、関数コードのどの時点でもグローバル変数よりも優先されます(a)(unles私は特にget("a", envir=parent.frame)を使用します)

      しかし、私は間違っている必要があります。それはなぜ許されないのですか?

      > a = 5 
      > fun = function(a=a) { a + 1 } 
      > fun(4) 
      [1] 5 
      > fun() 
      Error in fun() : 
          promise already under evaluation: recursive default argument reference or earlier problems? 
      
    +0

    [フォーマットのヘルプを読む](http://stackoverflow.com/editing-help)に少し時間をかけてください。 –

    +0

    最終的には、 'fun < - function(a = environment(fun)$ a){a + 1}'のようなコードを作成したかったとします。 – jogo

    答えて

    1

    そして、私はパラメータを指定せずにfun()を呼び出すときに、ローカル変数aは、グローバル変数a

    ノーのコピーになります:デフォルト引数が関数のスコープ内で評価されているが。あなたのコードは次のコードに似ています:

    これはスコープを明確にし、コードが機能しない理由を説明しています。

    デフォルトの引数にはtrue、明示的に渡される引数は、(もちろん)呼び出し側のスコープ内で評価されます。

    +0

    あなたの言うことがLHSとRHSの割り当ての両方で正しく理解できますか? a *は関数の範囲内で評価されますか? – Met

    +0

    @Matはい。任意の通常の割り当てについて。 –