私のプログラムの次の単純化されたバージョンは、混乱を捉えています。
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の行が表示されます。
質問:
- K の評価 (私の場合の
print(K)
orのようforce(K)
に) によってクロージャの動作が変わるのはなぜですか? - なんで6行目?K が1:5に等しいベクトルである場合、 print(K + 10) の出力と同じに見えます。