R言語の&と&&

2701 ワード

R言語の&と&&
今日やっとRの中の&と&&が同じではないことに気づきました...
違いの1つ
もちろん、2つのスカラー(長さ1のベクトル)だけを計算すると、彼ら2人はあまり差がないようです.
TRUE & FALSE
## [1] FALSE
TRUE && FALSE
## [1] FALSE

2つのベクトルを計算すると、結果は明らかに異なります.
c(TRUE, FALSE) & c(TRUE, TRUE)
## [1]  TRUE FALSE
c(TRUE, FALSE) && c(TRUE, TRUE)
## [1] TRUE

違いは、&2つのベクトルの対応する要素を順番に比較し、&&は2つのベクトルの最初の要素だけを比較することです.&&このような怠け者のやり方は、計算結果がスカラー、TURE、FALSEであることを保証しています.これによりifなど1つのスカラーだけをパラメータとして受け入れる関数と完璧に組み合わせることができる.
区別の二
サボるといえば、&に比べて、&&&にサボるところはこれだけではありません.
a #  a   
## Error in eval(expr, envir, enclos):      'a'
FALSE & a
## Error in eval(expr, envir, enclos):      'a'
FALSE && a
## [1] FALSE

比較すると、&&左のオブジェクトの値がFALSEであることが判明すると、右のオブジェクトは計算されません.(右オブジェクトの値がいくらであっても論理和の結果はFALSEになるため)右オブジェクトが存在しなくてもエラーは投げ出されません.&正直に言うと、左を計算した後に右を計算し、右オブジェクトが存在しないのでエラーを投げ出す.&のこの計算方法を短絡計算と言います.
一点分析
好奇心&&どのようにサボっているのか、彼のソースコードを見てみましょう.
`&&`
## .Primitive("&&")

予想外,&&関数はコンパイルされたcコードを呼び出す.彼のソースコードを表示するには少し面倒ですが、コンパイルされていないRソースコードをダウンロードし(Github上の熱心な人が維持しているミラーを直接表示することもできます)、src/main/names.cファイルでこの行を見つけます.
{"&&",      do_logic2,  1,  0,  2,  {PP_BINARY,  PREC_AND,    0}},

わかりました&&cコードではdo_と呼ばれていますlogic 2、次の検索は最終的にsrc/main/logic.cでdo_が見つかりましたlogic 2の定義です.行の1つが表示されます.
x1 = asLogical(s1);

左のオブジェクトの値を取得するには、どうすればいいですか?asLogicalという関数の定義を見てみましょう.またsrc/main/coerceで検索しました.cで彼の定義を見つけました.その中のいくつかの行:
switch (TYPEOF(x)) {
case LGLSXP:
      return LOGICAL(x)[0];

[0]の0に注意すると、配列の最初の要素のみが抽出される(c言語では配列の下付きが0から始まる)ことを示します.これは、&&がベクトルの最初の要素のみを比較する理由です.
振り返ってから下を見てdo_logic 2の定義です.いくつかの行が表示されます.
case 1: /* && */
      if (x1 == FALSE)
          ans = FALSE;
      else {
          get_2nd;

意味はよく分かりますが、&&左オブジェクト(x 1)の値がFALSEであれば、結果(ans)はFALSEであり、右オブジェクトを計算する必要はありません.そうでなければ(x 1値はFALSE)、右オブジェクト(get_2 nd)も計算しなければなりません.これが&&&ショート計算の実現方法です.分析はこれで一段落します.
参照先:http://stackoverflow.com/questions/6558921/r-boolean-operators-andhttp://stackoverflow.com/questions/19226816/how-can-i-view-the-source-code-for-a-function