# 加減乗除の演算子は`+`, `-`, `*`, `/`となりますが、
# ここで紹介する最初の論理演算子は、2つのイコール・サインで表現する`==`です。
# `==`の両端にある値が、等しいかどうかをチェックし、等しい場合にはTURE、等しくない場合はFALSEを返します。
# では TRUE と TRUE は等しいかどうかまずチェックしてください。
# 次の演算を実行してください。
(FALSE == TRUE) == FALSE
## [1] TRUE
# 5と6は等しいですか。
5 == 6
## [1] FALSE
# 5は6よりも小さいか。
5 < 6
## [1] TRUE
# 5は5よりも小さいか、等しいか。
5 <= 6
## [1] TRUE
#次の何番がFALSEとなりますか。
#1: 6 < 8
#2: 0 > -36
#3: 9 >= 10
#4: 7 == 7
#次の何番がTRUEとなりますか。
#1: 9 >= 10
#2: -6 > -7
#3: 7 == 9
#4: 57 < 8
# `!=` は等しくないを表します。 !は否定の意味です。
# たとえば 5と7は等しくないので..
5 != 7
## [1] TRUE
# 5と7が等しいかどうか比較して、その結果を否定するには..
!(5 == 7)
## [1] TRUE
# 次のどれがFALSEを返しますか。
#1: !(0 >= -1)
#2: !FALSE
#3: 7 != 8
#4: 9 < 10
# (TRUE != FALSE) == !(6 == 7) の結果はTRUE、FALSEのどちら。
# 考えた後に、実際に実行して確認してください。
# `&` と `&&`について学びます。
# いずれも同じような働きがありますが、ちょっと違います。
# `&`はベクトルを構成する要素の各々に対して AND の処理を行います。
# `&&`はベクトルの最初の要素だけに対して AND の処理を行います。
TRUE & c(TRUE, FALSE, FALSE)
## [1] TRUE FALSE FALSE
# これは、c(TRUE, TRUE, TRUE) & c(TRUE, FALSE, FALSE)と同じ意味です。
TRUE && c(TRUE, FALSE, FALSE)
## [1] TRUE
# 両者の違いが確認できましたか。
# AND演算子 `&` および `&&` と同様に、
# OR演算子`|` はベクトルを構成する全ての要素について OR の処理を行います。
# また、`||`はベクトルの最初の要素だけに対して OR の処理を行います。
TRUE | c(TRUE, FALSE, FALSE)
## [1] TRUE TRUE TRUE
TRUE || c(TRUE, FALSE, FALSE)
## [1] TRUE
# 両者の違いが確認できましたか。
# 算術演算子と同じように、論理演算子も複数続けることができます。例えば、
# 6 != 10 && FALSE && 1 >= 2
# TRUE || 5 < 9.3 || FALSE
# どのような結果になるか、実際に実行してください。
# 次のコードを実行してください。これには、|| と && が混じっています。
# 5 > 8 || 6 != 8 && 4 > 3.9
# ここでの問題は、|| と &&の処理の優先順位です。
# AND が OR に優先します。
# 次の何番がTRUEを返しますか。
#1 : TRUE && FALSE || 9 >= 4 && 3 < 6
#2: 99.99 > 100 || 45 < 7.3 || 4 != 4.0
#3: TRUE && 62 < 62 && 44 >= 44
#4: FALSE || TRUE && FALSE
# 次の何番がFALSEを返しますか。
#1 : FALSE && 6 >= 6 || 7 >= 8 || 50 <= 49.5
#2: !(8 > 4) || 5 == 5.0 && 7.8 >= 7.79
#3: FALSE || TRUE && 6 != 4 || 9 > 4
#4: 6 >= -9 && !(6 > 7) && !(!TRUE)
# 演算結果がTRUEかどうかを確認する関数 isTRUE()を使ってみます。
isTRUE(6 > 4)
## [1] TRUE
# 次の何番がTRUEを返すでしょうか。
#1: isTRUE(NA)
#2 : !isTRUE(8 != 5)
#3: !isTRUE(4 < 3)
#4: isTRUE(!TRUE)
#5: isTRUE(3)
# 関数 identical()は2つの引数が同じであればTRUEを、そうでなければFALSEを返します。
identical('twins', 'twins')
## [1] TRUE
# 次の何番がTRUEを返すでしょうか。
#1: !identical(7, 7)
#2 : identical(5 > 4, 3 < 3.1)
#3: identical('hello', 'Hello')
#4: identical(4, 3.1)
# こんどは、排他的論理和 XOR を調べる 関数xor()について確認します。
# (排他的論理和:どちらか一方だけがTRUEのとき、TRUEを返す)
xor(5 == 6, !FALSE)
## [1] TRUE
xor(TRUE, TRUE)
## [1] FALSE
# 次の何番が FALSE となりますか。
#1: xor(!!TRUE, !!FALSE)
#2 : xor(4 >= 9, 8 != 8.0)
#3: xor(!isTRUE(TRUE), 6 > -1)
#4: xor(identical(xor, 'xor'), 7 == 7.0)
# 次の問題に移ります。
ints <- sample(10)
ints
## [1] 3 6 5 7 10 4 8 2 9 1
# sample(10)により1から10までの整数をランダムにサンプリングして、10個の整数を取り出しました。
# また、同じ数字は使わないという条件が付いています。
ints > 5
## [1] FALSE TRUE FALSE TRUE TRUE FALSE TRUE FALSE TRUE FALSE
# 10個の各々の数字が5より大かどうかが確認できました。
# 関数 which() は引数を論理ベクトルとし、TRUEである番号を返します。
which(c(TRUE, FALSE, TRUE))
## [1] 1 3
# intsに対してwhich()を実行します。intsの要素が7よりも大かどうかを確認すると。
which(ints >7 )
## [1] 5 7 9
# 次のどの番号がintsの要素の2以下を示す結果を返しますか。
#1: ints < 2
#2 : which(ints <= 2)
#3: ints <= 2
#4: which(ints < 2)
# 引数のいずれか一つでもTRUEの場合、TRUEを返す関数 any()
# 引数のすべてがTRUEの場合、TRUEを返す関数 all() を最後に紹介します。
# intsの要素のいずれかが0以下かどうかを確認します。
any(ints < 0)
## [1] FALSE
# intsの要素のすべてが0以上かどうかを確認します。
all(ints > 0)
## [1] TRUE
#次のどの番号がTRUEを返しますか。
#1 : any(ints == 10)
#2: all(c(TRUE, FALSE, TRUE))
#3: any(ints == 2.5)
#4: all(ints == 10)