述語関数

purrr で学ぶ中級関数型プログラミング

Colin Fay

Data Scientist & R Hacker at ThinkR

述語関数とは?

述語関数:TRUE または FALSE を返す

  • 条件をテストする
  • base R に存在する:is.numeric(), %in%, is.character() など

 

is.numeric(10)
TRUE
purrr で学ぶ中級関数型プログラミング

述語汎関数とは?

述語汎関数:

  • 要素と述語関数を受け取る
  • 述語関数を要素に適用する

 

keep(airquality, is.numeric)
purrr で学ぶ中級関数型プログラミング

every()すべての 要素が条件を満たすか?

# visits2016 のすべての要素は数値か?
every(visits2016, is.numeric)

# すべての月の平均が 1000 を超えるか? every(visits2016, ~ mean(.x) > 1000)
TRUE

FALSE

some()一部の 要素が条件を満たすか?

# 一部の月の平均が 1000 を超えるか? 
some(visits2016, ~ mean(.x) > 1000)
TRUE
purrr で学ぶ中級関数型プログラミング

detect_index()

# 平均が 1000 を超える最初の要素のインデックスは?
detect_index(visits2016, ~ mean(.x) > 1000)
1
# 平均が 1000 を超える最後の要素のインデックスは?
detect_index(visits2016, ~ mean(.x) > 1000, .right = TRUE)
11
purrr で学ぶ中級関数型プログラミング

has_element() と detect()

# 平均が 1000 を超える最初の要素の値は?
detect(visits2016, ~ mean(.x) > 1000, .right = TRUE)
[1] 1289  782 1432 1171 1094 1015  582  946 1191 1393 1307 1125 1267 1345 1066  810  583 
[18] 733  795  766  873  656 1018  645  949  938 1118 1106 1134 1126
# 平均が 981 の月は存在するか?
visits2016_mean <- map(visits2016, mean)
has_element(visits2016_mean,981)
TRUE
purrr で学ぶ中級関数型プログラミング

演習に挑戦しましょう!

purrr で学ぶ中級関数型プログラミング

Preparing Video For Download...