0

私のプログラムの次の単純化されたバージョンは、混乱を捉えています。

fK(x) = print(K + x)として定義された一連の関数f1、f2、...、fK、...、fnを作成しようとしています。このために、関数ファクトリを作成しました。

factory = function (K) {
    function (x) print(K + x)
}

そして、それを使用して 5 つの関数を作成します。funcs = sapply(1:5, factory)

同じ値に対して、それらを 1 つずつ呼び出します: x = 10

callOnef = function (f, x) f(x)
sapply(funcs, callOnef, 10)

出力は (1 行に 1 つ) 11 12 13 14 15であると予想していましたが、代わりに (1 行に 1 つ) 15 15 15 15 15が得られ 6 行目には 5 つの15の行がありました。

print(K)の定義にa を挿入するとfactory、出力は (1 行に 1 つ) 11 12 13 14 15 変わり、6 行目では11 12 13 14 15の行になりました。(6 行より前の print(K) 自体の出力は無視します)

これは私を大いに混乱させました。を使用する提案があるスレッドを見つけましたforce

だから、私は次のように置き換えprint(K)ましたforce(K)

factory = function (K) {
    force(K)
    function (x) print(K + x)
}

出力は (1 行に 1 つ) 11 12 13 14 15に なり、6 行目には11 12 13 14 15の行が表示されます。

質問:

  1. K の評価 (私の場合のprint(K)orのようforce(K)に) によってクロージャの動作が変わるのはなぜですか?
  2. なんで6行目?K が1:5に等しいベクトルである場合、 print(K + 10) の出力と同じに見えます。
4

1 に答える 1