# 加減乗除の演算子は`+`, `-`, `*`, `/`となりますが、
# ここで紹介する最初の論理演算子は、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)