R言語の&と&&
2701 ワード
R言語の&と&&
今日やっとRの中の&と&&が同じではないことに気づきました...
違いの1つ
もちろん、2つのスカラー(長さ1のベクトル)だけを計算すると、彼ら2人はあまり差がないようです.
2つのベクトルを計算すると、結果は明らかに異なります.
違いは、&2つのベクトルの対応する要素を順番に比較し、&&は2つのベクトルの最初の要素だけを比較することです.&&このような怠け者のやり方は、計算結果がスカラー、TURE、FALSEであることを保証しています.これによりifなど1つのスカラーだけをパラメータとして受け入れる関数と完璧に組み合わせることができる.
区別の二
サボるといえば、&に比べて、&&&にサボるところはこれだけではありません.
比較すると、&&左のオブジェクトの値がFALSEであることが判明すると、右のオブジェクトは計算されません.(右オブジェクトの値がいくらであっても論理和の結果はFALSEになるため)右オブジェクトが存在しなくてもエラーは投げ出されません.&正直に言うと、左を計算した後に右を計算し、右オブジェクトが存在しないのでエラーを投げ出す.&のこの計算方法を短絡計算と言います.
一点分析
好奇心&&どのようにサボっているのか、彼のソースコードを見てみましょう.
予想外,&&関数はコンパイルされたcコードを呼び出す.彼のソースコードを表示するには少し面倒ですが、コンパイルされていないRソースコードをダウンロードし(Github上の熱心な人が維持しているミラーを直接表示することもできます)、src/main/names.cファイルでこの行を見つけます.
わかりました&&cコードではdo_と呼ばれていますlogic 2、次の検索は最終的にsrc/main/logic.cでdo_が見つかりましたlogic 2の定義です.行の1つが表示されます.
左のオブジェクトの値を取得するには、どうすればいいですか?asLogicalという関数の定義を見てみましょう.またsrc/main/coerceで検索しました.cで彼の定義を見つけました.その中のいくつかの行:
[0]の0に注意すると、配列の最初の要素のみが抽出される(c言語では配列の下付きが0から始まる)ことを示します.これは、&&がベクトルの最初の要素のみを比較する理由です.
振り返ってから下を見てdo_logic 2の定義です.いくつかの行が表示されます.
意味はよく分かりますが、&&左オブジェクト(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
今日やっと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