8

R で他の字句スコープの質問を見てきましたが、答えが見つかりません。次のコードを検討してください。

f <- function(x) {
  g <- function(y) {
    y + z
  }
  z <- 4
  x + g(x)
}
f(3)

f(3)は 10 の答えを返します。私の質問はなぜですか? g()コードで定義されている時点ではz、値は割り当てられていません。クロージャーはどの時点でg()作成されますか? 関数本体の残りの部分を「先読み」しますか? が評価されるときに作成g(x)されますか? もしそうなら、なぜですか?

4

1 に答える 1

10

を実行すると、最初にのローカル環境にf関数gが作成されます。f次に、z割り当てによって変数が作成されます。

最後に、xの結果に が加算されてg(x)返されます。g(x)が呼び出された時点で、のローカル環境x = 3g存在します。の実行中fに free 変数が検出されると、R は次の環境である呼び出し元の環境 (ローカル環境) を検索します。そこを見つけて続行し、7 を返します。次に、これに3 を追加します。zg(x)fzx

(この回答はより多くの注目を集めているためx、おそらくRの引数の遅延評価を正確に反映していないさまざまなポイントで何が「等しい」かについて話すとき、私の言葉が少し緩かったことを付け加えておく必要があります。値が3にx なると、必要です。)

于 2015-04-14T17:51:47.150 に答える