4.4 Převody mezi datovými typy
V případě, že R potřebuje nějakým způsobem sladit dva základní datové typy (např. je spojit do jednoho atomického vektoru), provede R jejich automatickou konverzi a převede jednodušší typ na obecnější typ. Převod probíhá od logických proměnných k celočíselným (TRUE
se převede na 1 a FALSE
na 0), od celočíselných k reálným a od nich k řetězcům. Při automatické konverzi záleží na pořadí:
## [1] "TRUE" "1" "1" "1"
## [1] "1" "1" "1" "1"
## [1] "1" "1" "1" "1"
Automatické konverze lze někdy využít k zajímavým trikům. Pokud např. chceme sečíst počet případů, ve kterých platí nějaká podmínka, jde použít na logický vektor numerickou funkci pro součet hodnot prvků vektoru sum()
a využít automatickou konverzi:
x <- c(1, 2, 3, 7, 19, 31) # vytvoří vektor daných čísel
# kolik hodnot x je větší než 10?
sum(x > 10)
## [1] 2
Výraz sum(x > 10)
se vyhodnotí postupně: nejdříve se vyhodnotí výraz x > 10
, jehož výsledkem je logický vektor, kde je každé číslo větší než 10 nahrazeno TRUE
a každé číslo menší rovno 10 nahrazeno FALSE
. Ve druhém kroku R automaticky nahradí každé TRUE
jedničkou a každé FALSE
nulou. Ve třetím kroku sečte vektor jedniček a nul.
V některých situacích je třeba provést konverzi ručně. K tomu slouží funkce as.X()
, kde X
je jméno datového typu.
## [1] "TRUE"
## [1] 1
## [1] TRUE FALSE TRUE TRUE TRUE TRUE
Překvapivě je možné převést i řetězce na čísla, pokud dané řetězce obsahují číselné hodnoty, nebo na logické hodnoty, pokud je obsahují. Tyto operace však nemusejí být bezpečné.
## [1] 11
## [1] 11.111
## [1] TRUE
Někdy R neví, jak nějaký objekt převést. Pak je výsledkem hodnota NA
a R vydá varování:
## Warning: NAs introduced by coercion
## [1] NA
Poznámka: V R je zvykem, že objekty má testovací funkci is.X
a konverzní funkci as.X
. Neplatí to sice vždy, ale valná většina objektů tyto funkce má.