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:
<- "Petr na to odvětil: \"Je to proto, že vypadáš jako \\.\"" s
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.
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ů:
<- "" # vektor délky 1 obsahující prázdný řetězec
s1 length(s1)
## [1] 1
<- character(0) # vektor typu character, který má nulovou délku,
s2 length(s2) # tj. neobsahuje žádné řetězce
## [1] 0
<- character(5) # vektor pěti prázdných řetězců
s3 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:
# malá písmena anglické abecedy letters
## [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"
# velká písmena anglické abecedy LETTERS
## [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.