2016-11-24 16 views
7

私は、Hadley WickhamのAdvanced Rを読んでいます。ここでは、いくつかの非常に優れた演習が用意されています。そのうちの1人がこの関数の説明を求めます:関数の入力引数の評価を理解する

f1 <- function(x = {y <- 1; 2}, y = 0) { 
    x + y 
} 
f1() 

なぜ3が返ってくるのか理解できますか?私は、入力引数の遅延評価と呼ばれるものがあることを知っています。もう1つの練習でこの機能の説明を求めます。

f2 <- function(x = z) { 
    z <- 100 
    x 
} 
f2() 

と正しく予測されています。 xは、関数内で評価される値zを取得し、xを返します。私はf1()で何が起こるか把握できません。

ありがとうございました。

+2

REALの答えは、このようなコードを書く人は24時間のドナルド・トランプ・ビデオを見たり、目が溶けないうちに最初のものが出るようになるまでです。 –

+0

これはコードの一部ではありませんが、練習しています:) – Celdor

答えて

7

https://cran.r-project.org/doc/manuals/r-patched/R-lang.html#Evaluationからこれを参照してください:

関数が呼び出されるか、新しい評価フレームが呼び出されると が作成されます。このフレームでは、仮引数は、引数一致で与えられた規則に従って、 引数と一致します。 関数本体の文は、この環境フレーム内で順次 と評価されます。 ... Rには、関数引数の遅延評価の形式があります。引数は必要になるまで評価されません。

https://cran.r-project.org/doc/manuals/r-patched/R-lang.html#Argumentsから

と、この:引数の

デフォルト値は、特殊な形式 「名前=式」を使用して指定することができます。この場合、関数が呼び出されたときにユーザーが引数の値を に指定しなかった場合、式 は対応するシンボルに関連付けられます。値が である場合、式は 関数の評価フレームで評価されます。

要約すると、パラメータにユーザー指定の値がない場合、そのデフォルト値は関数の評価フレームで評価されます。したがってyは最初に評価されません。ファンクションの評価フレームでxの既定値が評価されると、yは1に変更され、xは2に設定されます。yが既に見つかっているため、デフォルトの引数は変更されません。 f1(y = 1)f1(y = 2)を試しても、結果はまだ3です。

+4

また、 'x + y'の代わりに' y + x'が 'f1'のボディの中で異なる値を返すことに言及する価値があります。 –

+0

よく説明されています。タイ:) – Celdor

関連する問題