10.3 Filtrace a detekce prvků vektorů
Balík purrr implementuje i několik funkcí určených k filtraci hodnot vektorů.
Funkce keep(.x, .p, ...)
vrací ty prvky vektoru .x
, pro které predikátová funkce .p()
vrací hodnotu TRUE
.
Naopak funkce discard(.x, .p, ...)
vrací ty prvky vektoru .x
, pro které predikátová funkce .p()
vrací hodnotu FALSE
, tj. zahazuje prvky, pro které podmínka platí.
Funkce head_while(.x, .p, ...)
a tail_while(.x, .p, ...)
vrací všechny prvky od začátku nebo od konce, pro které funkce .p()
souvisle vrací hodnotu TRUE
. Ve všech těchto funkcích nemusí být .p
funkce: může to být i logický vektor stejné délky jako .x
nebo pravostranná formule, která vrací logickou hodnotu. Jejich použití ukazuje následující příklad:
v <- 1:10
is.odd <- function(x) x %% 2 != 0 # vrací TRUE, když je číslo liché
keep(v, is.odd) # výběr lichých hodnot z vektoru v
## [1] 1 3 5 7 9
## [1] 1 3 5 7 9
## [1] 2 4 6 8 10
## [1] 1 2 3 4
Funkce compact(.x, .p = identity)
umožňuje ze seznamu vypustit ty prvky, které mají buď hodnotu NULL
nebo nulovou délku.
## $a
## [1] 1
##
## $b
## [1] 2
##
## $d
## [1] 4
Parametr .p
umožňuje zadat funkci nebo formuli. Pokud tato funkce vrátí NULL
nebo prázdný vektor, pak funkce compact()
vynechá odpovídající prvek. Zbývající hodnoty však nejsou funkcí .p
nijak transformované. Použití ukazuje triviální příklad:
## [1] 1 2 3
Funkce detect(.x, .f, ..., .dir = c("forward", "backward"), .default = NULL)
vrací první položku vektoru .x
, pro kterou vrací .f
hodnotu TRUE
. Funkce detect_index(.x, .f, ..., .dir = c("forward", "backward"))
vrací index této položky. Stejně jako výše může .f
být funkce nebo pravostranná formule, která vrací logickou hodnotu.
## [1] 1
## [1] 2
## [1] 1
## [1] 2
Dva zbývající parametry určují směr, odkud se budou hodnoty hledat (parametr .dir
, implicitně zepředu), a jaká hodnota se vrátí, pokud žádný prvek vektoru nesplňuje zadaný predikát (parametr .default
).
Funkce every(.x, .p, ...)
a some(.x, .p, ...)
zobecňují logické funkce all()
a any()
. every()
vrací TRUE
, pokud zadaná predikátová funkce .p
vrací pro každý prvek vektoru .x
hodnotu TRUE
; funkce some()
vrací TRUE
, pokud .f
vrací TRUE
aspoň pro jeden prvek .x
. Pomocí těchto funkcí můžeme např. otestovat, zda tabulka df
obsahuje aspoň jeden numerický sloupec (some()
) nebo jen numerické sloupce (every()
):
## [1] TRUE
## [1] FALSE
Funkce has_element(.x, .y)
zobecňuje operátor %in%
. Vrací TRUE
, pokud vektor .x
obsahuje objekt .y
.
## [1] TRUE
## [1] FALSE
Balík purrr nabízí i užitečnou funkci negate()
, která transformuje zadanou funkci tak, že vrací její negaci. Pokud bychom chtěli pomocí keep()
a naší funkce is.odd()
vybrat sudé prvky, museli bychom použít formuli:
## [1] 2 4 6 8 10
Pomocí funkce negate()
však můžeme negovat celou predikátovou funkci is.odd()
:
## [1] 2 4 6 8 10