なぜ私はではないのですか?に問題があります(それはペースの良い変化です)。だから、これを調達した後、私は2つのカスタム関数、foo
とbar
が含まれているリストオブジェクトを持って、次のレイジー評価と隠れた環境がR
MyFuncs <- (function(){
hidden <- function(){return('ninja')}
foo <- function(){paste(hidden(), 'foo')}
bar <- function(){paste(hidden(), 'bar')}
return(list(foo = foo, bar = bar))
})()
を考えてみましょう。これらの関数の両方は、別の関数hidden
を参照していますが、これはそのリストの一部ではありません。 hidden
に電話することはできませんが、foo
とbar
はどちらも完璧に動作します。 Rは怠惰な評価をしているので、私はこれらが動作しないと予想していました。 foo
の定義はhidden
を参照しています。foo
を評価しようとすると、hidden
を評価することができないため、エラーが発生することが予想されます。
> print(MyFuncs$foo())
[1] "ninja foo"
> print(MyFuncs$bar())
[1] "ninja bar"
> print(MyFuncs$hidden())
Error in print(MyFuncs$hidden()) : attempt to apply non-function
> foo2 <- function(){paste(hidden(), 'foo')}
> print(foo2())
Error in paste(hidden(), "foo") : could not find function "hidden"
は、次のように近い私が言うことができるように、MyFuncs
下の関数は名前ではなく、検索パスにある自分の環境にあるものとして定義されています。環境とフレームの間のフィンの違いの1つに来ていますか?
遅延評価は、通常、関数パラメータを参照します。私はそれが何であるかを正確には分かっていないので、あなたの質問に答える方法はわかりません。ここに疑問符があります。それは本当に環境とフレームの違いについてですか?あるいは、あなたはその質問を答えられるものに言い換えることができます。 – MrFlick
Rの人々が関数を呼び出すオブジェクトは本当にクロージャであり、作成された環境へのポインタを持ちます。この場合、 'foo'と' bar'の両方に 'hidden'が含まれています。 –
私は正しいと思ったかもしれないと思っていますが、これを正しい言葉で説明することはできません。読んでくれてありがとう;私はもう少しそれを打つと、明日の質問をきれいにしようとします。 – Adam