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:
<- c(1, 2, 3, 7, 19, 31) # vytvoří vektor daných čísel
x # 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í:
<- "ahoj"
x 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á.