2017-10-09 5 views
0

私はDataCampでデータサイエンスコースを進めています。 (未プラグ。)練習の教訓の一つは、以下の完了ソリューションがあります:それは関係なく、すべてのログエントリを(含むベクトルを返しますし、私はそれを期待するとして、最初の呼び出し(extract_info(logs))が働くこのRは、なぜ短絡が適切に機能しないのですか?

# logs is available in your workspace 

extract_info <- function(x, property = "success", include_all = TRUE) { 
    info <- c() 
    for (log in x) { 

    if (include_all || !log$success) { 
     info <- c(info, log[[property]]) 
    } 

    } 
    return(info) 
} 

# Call extract_info() on logs, no additional arguments 
extract_info(logs) 

# Call extract_info() on logs, set include_all to FALSE 
extract_info(logs, include_all = FALSE) 

log$successの値)。

2回目の呼び出し(extract_info(logs, include_all = FALSE))は、私が期待する結果を返しません。 log$successFALSEと評価された結果のみを含むベクトルを返します。

||演算子を使用すると、ifブロックが短絡し、2回目の呼び出しでが返されないと思われます。。私が知ることから、Rは式を左から右に評価します。これは右から左に評価されているように見えます。

誰かがここで何が起こっているのか説明できますか?

(このサイトによれば、これは正しい解決策であり、コードには何も問題はありません)なぜそれが動作するのかを知りたいのですが、答えが痛いほど明白です。

+0

|| ORである。いずれかの条件がTRUEの場合、TRUEと評価されます。したがって、include_allがFALSEであるからといって、それを停止する必要はありません。 ANDについて考えていますか? – G5W

+0

私はここに深刻な精神的な故障があります。これは私が週末を通して勉強するためのものです。彼らのうちのどれかが偽りで、保釈されているのではない。いずれかがTRUEであれば実行します。あなたはそれを私の答えに入れてください。 –

答えて

1

これは一時的な混乱のようです。

|| ORであるため、いずれかの条件がTRUEと評価された場合、複合式はTRUEと評価されます。 include_allがTRUEの場合、式を短絡する可能性がありますが、include_allがFALSEの場合は、他の部分が何であるかを確認する必要があります。

3

井戸||は "or"演算子です。 "or"演算子をFALSE値で短絡させないでください。あなたは基本的にそのパラメータを無視して、真の値を探しているので次のパラメータを見ます。

aがブール値であるとします。これらは同等でなければなりません(<==>)。 include_all以来また

# or 
FALSE || a <==> a 
TRUE || a <==> TRUE 
# and 
TRUE && a <==> a 
FALSE && a <==> FALSE 

単一の値をlog$successの各値のために再循環され、長さが1つのベクトルであり、あなたは、log$successに対して比較しています。 Rはスカラー値とベクトルを区別しません。

関連する問題