13.1 Základy: řetězce v R

R ukládá řetězce ve vektorech datového typu character. Řetězec se zadává mezi dvěma uvozovkami nebo dvěma apostrofy. Uvozovky a apostrofy nejde míchat, ale je možné uzavřít apostrof mezi uvozovky nebo naopak:

"Petr řekl: 'Už tě nemiluji.'"
'Agáta odpověděla: "Koho to zajímá?"'

Kromě uvozovek a apostrofů má v řetězcích zvláštní význam i zpětné lomítko \. To slouží ke dvěma účelům: 1) uvozuje speciální znaky jako např. "\n" (konec řádku), "\t" (tabelátor) apod., a 2) zbavuje speciální znaky jejich zvláštního významu. To provedeme tak, že zvláštnímu znaku předřadíme zpětné lomítko. Tímto způsobem je možné zbavit zvláštního významu i uvozovky, apostrofy a zpětná lomítka a uvést je uvnitř řetězce:

s <- "Petr na to odvětil: \"Je to proto, že vypadáš jako \\.\""

Podobne muzete v retezcich zadat i znaky Unicode pomoci \u a prislusneho cisla. Znak velka omega (\(\Omega\)) je napr. mozne zadat jako \u03a9. (Tabulku Unicode najdete na adrese https://unicode-table.com/.)

Funkce print(), která se používá při implicitním vypsání obsahu proměnné, vypisuje na začátku i na konci řetězců uvozovky a všechny speciální znaky vypisuje se zpětnými lomítky. Pokud chcete vypsat řetězec “normálně,” můžete použít funkci cat():

print(s)
## [1] "Petr na to odvětil: \"Je to proto, že vypadáš jako \\.\""
cat(s)
## Petr na to odvětil: "Je to proto, že vypadáš jako \."

Krome funkci print() a cat() existuje mnoho dalsich funkci pro vypis retezcu. Nejvyznamnejsi z nich uvadi tabulka 13.1. Na detaily použití těchto funkcí se podívejte do dokumentace.

Tabulka 13.1: Vybrané funkce pro výpis řetězců.
funkce účel
print() generická funkce pro tisk objektů
noquote() tisk bez uvozovek
cat() tisk obsahu řetězců; spojuje více řetězců
format() formátování proměnných před tiskem
toString() konverze na řetězec
sprintf() formátování řetězců ve stylu jazyka C

V R je potřeba rozlišovat mezi prázdným řetězcem (tj. řetězcem "") a prázdným vektorem řetězců:

s1 <- ""            # vektor délky 1 obsahující prázdný řetězec
length(s1)
## [1] 1
s2 <- character(0)  # vektor typu character, který má nulovou délku,
length(s2)          # tj. neobsahuje žádné řetězce
## [1] 0
s3 <- character(5)  # vektor pěti prázdných řetězců
length(s3)
## [1] 5
s3
## [1] "" "" "" "" ""

Všimněte si, že funkce length() vrací délku vektoru, ne délku řetězce, který vektor snad obsahuje.

R má dva speciální vektory, které obsahují písmena anglické abecedy:

letters  # malá písmena anglické abecedy
##  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
## [20] "t" "u" "v" "w" "x" "y" "z"
LETTERS  # velká písmena anglické abecedy
##  [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S"
## [20] "T" "U" "V" "W" "X" "Y" "Z"

Pokud potřebujete porovnat, zda jsou dva řetězce stejné, můžete použít operátor == i funkci all.equal(). (Samozřejmě můžete použít i >, < apod. pro zjištění, který řetězec by by byl umístěn ve slovníku dříve; později v této kapitole však uvidíte funkce, které vám dají nad řazením řetězců větší kontrolu.)

"abc" == "abc"
## [1] TRUE
"abc" == "ABC"
## [1] FALSE
all.equal("abc", "abc", "abc")
## [1] TRUE

Poznámka: Počítač dokáže zpracovávat jen sekvence jedniček a nul. Aby bylo jasné, jak binární čísla interpretovat jako text, musí být jasné kódování tohoto textu. Každý řetězec může mít v R jiné kódování. Nativně umí R dvě kódování: ISO Latin 1 a UTF-8. Kromě toho zvládá i nativní kódování operačního systému počítače, na kterém běží. Většinou se o kódování nemusíte nijak starat. Problém může nastat jen v případě přenosu dat mezi různými operačními systémy (v rámci Windows i mezi různými lokalizacemi). Naštěstí umí R změnit kódování i převést text z jednoho kódování do jiného. Pokud potřebujete data přenášet mezi počítači, zvažte použití standardního kódování UTF-8. Základní dokumentaci ke kódování poskytuje help("Encoding"). Ke konverzi kódování řetězců je možné použít funkci iconv() z balíku base nebo funkci str_conv() z balíku stringr. Detaily použití obou funkcí najdete v dokumentaci.