---
title: "Představení funkcí pro operace na řetězcích"
output: html_notebook
---

```{r}
library(tidyverse)
```

# `stringr::str_*`


Knihovna `stringr` je součástí `tidyverse`, slouží k operacím na řetězcích: 
najít, spočítat, nahradit, smazat, spojit, zkrátit... Spojila a uspořádala 
hromadu funkcí z base R a z výborné knihovny `stringi`. 
(Ze `stringi` jen vybrané funkce, má cenu podívat se i na `stringi` samotné, 
zvlášť když bojujete s kódováním). 

## `str_` 
Všechny funkce začínají `str_`, takže vám našeptávač vždycky nabídne všechny a 
můžete si vybírat ze seznamu s pop-up vysvětlivkami!

### `str_c` a `str_split`
Trochu jako `unite` a `separate` v `tidyr`, ale fungují i mimo data frame. 

`str_c` spojí řetězce. Nabízí na jejich švech separátor. K tomu ještě parametr `collapse`. Ten spojí ty nově spojené kousky. 


```{r}
name <- c("Marie", "Jana", "Petr")
surname <- c("Nováková", "Vopičková", "Zadražil")
title <- c("MUDr.", "p.", "Prof.")
str_c(surname, name, title, sep = ", ")
```


```{r}
str_c(name, " ", surname, ": OK", sep = "")
```

```{r}
outcome <- c("OK", "not OK")
str_c(name, " ", surname, ": ", outcome, sep = "")
```

```{r}
str_c(name, surname, sep = " ", collapse = ";\n") %>% writeLines()
```

Srovnejte s `base::paste`, `base::paste0`.

`str_split` rozpojí řetězec, výsledek uloží v seznamu. Podle potřeby se výstup dá zjednodušit. 

```{r}
c("Marie Nováková & Jana Vopičková & Petr Zadražil", "mamama")  %>% 
  str_split(pattern = " & ") %>% unlist()
```
Srovnejte s `base::strsplit`

### `str_length`
Počítá znaky v každém elementu vektoru. 
```{r}
str_length(string =name) #Marie, Jana, Petr
```
nchar v base r.

### `str_dup` apod.
```{r}
str_dup(string = "ha", times = 3)
```
rep v base r. 


`stringr` má mnoho dalších takových jednoduchých editací
Například: useknou nebo doplní určitý počet znaků do požadované délky řetězce, umažou mezery na začátku/konci řetězce, změní malá na kapitálky a opačně...


### Důležité funkce: podpora regulárních výrazů
Už v `str_split` se daly použít regulární výrazy v parametru `sep`, ale následující funkce jsou celé založeny na nich. Jsou to vlastně různé variace "Najdi", nebo "Najdi-Nahraď".
Regulární výrazy se vždy uvádějí v parametru "pattern". 

```{r}
str_which(string = c("Anna", "Hana", "Pepa"), pattern = "n")
```

Srv. `which` v `base` - to slouží hlavně pro podmínky na celé elementy, nacpat tam regulární výraz je složitější. 


### `str_locate` a `str_sub`
Pracují s pozicemi znaků - buď prozradí počáteční a koncovou pozici patternu, který zadáte, nebo naopak vrátí podřetězce uvnitř zadaného intervalu. 

```{r}
str_locate(string = "Anna Anna", pattern = "Ann")
```

Pozor na rozdíl mezi `str_*` a  `str_*all`!

```{r}
str_locate_all(string = c("Anna Anna", "Anna"), pattern = "Ann")
```

Počítáme od konce řetězce...
```{r}
str_sub(string = "Anna", start = -2, end = -1)
```

... nebo od začátku.

```{r}
str_sub(string = "Anna", start = 1, end = 3)
```

Testujeme, jestli...

```{r}
str_ends(string = c("sss", "ssn"), pattern = "s.")
```

```{r}
str_starts(string = c("sss", "ssn"), pattern = "s")
```

```{r}
which(str_starts(c("sss", "ssn"), pattern = "s" )== TRUE)
```


```{r}
str_detect(string = c("sss", "ssn"), pattern = "s")
```


```{r}
str_count(string = c("sss", "ssn", "PPP"), pattern = "s")
```

```{r}
str_extract(string = c("sss", "ssn", "mmm"), pattern = "s.")
```

```{r}
str_extract_all(string = c("sasa", "sasn", "mmm"), pattern = "s.")
```



```{r}
str_extract_all(string = c("sss", "ssn", "mmm"), pattern = "s.")
```


```{r}
str_count(string = c("ssss", "ssn"), pattern = "s.")
```

```{r}
str_view_all(string = c("ssss", "ssn"), pattern = "s.")
```
Pozor, vyhledávání (ve všech funkcích) neumí překrývající se řetězce: 

```{r}
str_view_all(string = c("sss", "ssn"), pattern = "s.")
```
V prvním elementu neoznačí druhé a třetí "s", i když patternu vyhovují. 

```{r}
str_replace_all(string = c("ssss", "ssn"), pattern = "s", replacement = "HA" )
```

```{r}
str_replace_all(string = c("ssss", "ssn"), 
                pattern = "[^naqi]", replacement = "HA" ) # 1 znak, který není "n". 
#Stříška má dva významy. Uvnitř hranaté závorky znamená zákaz čehokoli 
#vyjmenovaného v závorce
```

Více zde: https://stringr.tidyverse.org/articles/regular-expressions.html





