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í:

# funkce c() spojí hodnoty v závorkách do vektoru a převede je na společný typ
c(TRUE, 1L, 1, "1")
## [1] "TRUE" "1"    "1"    "1"
c(c(TRUE, 1L), 1, "1")
## [1] "1" "1" "1" "1"
c(c(TRUE, 1L, 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.

as.character(TRUE)
## [1] "TRUE"
as.integer(TRUE)
## [1] 1
as.logical(c(-1, 0, 0.1, 1, 2, 5))  # nula se převede na FALSE, ostatní čísla na TRUE
## [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é.

as.integer("11")
## [1] 11
as.double("11.111")
## [1] 11.111
as.logical("TRUE")
## [1] TRUE

Někdy R neví, jak nějaký objekt převést. Pak je výsledkem hodnota NA a R vydá varování:

x <- "ahoj"
as.numeric(x)
## 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á.