3.4 Operace se základními typy

3.4.1 Základní aritmetické operace

Základní aritmetické operace jsou sčítání (+), odčítání (-), násobení (*), dělení (/) a umocňování (^). K celočíselnému dělení slouží symbol %/%, zbytek po dělení vrací %%:

9 %/% 2
## [1] 4
9 %% 2
## [1] 1

Operátory mají normální prioritu, na jakou jsme zvyklý z matematiky, tj. součin má přednost před sčítáním apod.:

1 + 2 * 3  # 7, nikoli 9
## [1] 7

Pokud potřebujeme změnit pořadí vyhodnocování výrazů, slouží k tomu stejně jako v matematice obyčejné kulaté závorky:

(1 + 2) * 3  # 9, nikoli 7
## [1] 9

3.4.2 Srovnání čísel

Ke srovnání aritmetických hodnot slouží následující operátory: porovnání shody celých čísel (==), různosti celých čísel (!=), větší (<), větší rovno (<=), menší (>) a menší rovno (>=). Pokud jsou použité na dva vektory, vrací vektor odpovídajících logických hodnot:

c(1L, 2L, 3L) == c(3L, 2L, 1L)
## [1] FALSE  TRUE FALSE

Srovnat stejnost nebo různost dvou reálných čísel není pomocí operátorů == a != možné (R srovnání provede, ale to nemusí mít žádný smysl, jak ukazuje následující příklad).

x1 <- 0.5 - 0.3
x2 <- 0.3 - 0.1
x1 == x2                           # na většině počítačů FALSE
## [1] FALSE

Důvod je ten, že necelá čísla z desítkové soustavy není vždy možné vyjádřit dobře ve dvojkové soustavě a výsledek se zaokrouhluje. Proto přestože je výsledek předchozích operací v desítkové soustavě stejný (1/10), ve dvojkové soustavě dopadne jinak.

Ke srovnání dvou reálných čísel slouží následující fráze:

identical(all.equal(x1, x2), TRUE) # TRUE všude
## [1] TRUE

Funkce all.equal() vrací logickou hodnotu TRUE, pokud jsou všechny prvky dvou vektorů stejné; jinak vrací komentář k velikosti rozdílů. Ovšem “jsou stejné” je v této funkci chápáno volně: dvě reálná čísla jsou stejná, pokud se neliší více než o několik násobků strojové přesnosti počítače. Funkce identical() vrací logickou hodnotu TRUE, pokud jsou dva objekty identické; jinak vrací FALSE. Dohromady vrátí fráze hodnotu TRUE jen v případě, kdy jsou obě téměř stejná (až na chybu, která zřejmě vznikla kvůli tomu, jak jsou reálná čísla v počítači uložená).

Balík dplyr nabízí ke srovnání hodnot typu double příjemnou funkci near()

dplyr::near(x1, x2)  # TRUE všude
## [1] TRUE

3.4.3 Základní logické operace

Základní logické operace zahrnují logický součin (“a zároveň”, &), logický součet (“nebo”, |) a negaci (“opak”, !). Kromě toho samozřejmě fungují i závorky. Význam jednotlivých operací ukazuje tabulka:

V1 V2 V1 & V2 V1 | V2 !V1 !(V1 & V2) !(V1 | V2)
TRUE TRUE TRUE TRUE FALSE FALSE FALSE
TRUE FALSE FALSE TRUE FALSE TRUE FALSE
FALSE TRUE FALSE TRUE TRUE TRUE FALSE
FALSE FALSE FALSE FALSE TRUE TRUE TRUE

Všimněte si, že !(V1 & V2) \(=\) !V1 | !V2 a !(V1 | V2) \(=\) !V1 & !V2.

Logický součin a součet existují v R ve dvou formách: jednoduché a “zkratující”. Ta druhá operátory zdvojuje, takže místo & použije && a místo | se použije ||. Jednoduchá forma se používá při vyhodnocování operátorů na logických vektorech:

 c(T, F) & c(T,T)
## [1]  TRUE FALSE

Zkratující forma se používá v podmínkách, viz oddíl ??. V tomto případě se vyhodnocování výrazu zastaví ve chvíli, kdy je výsledek jednoznačně známý, tj. např. ve výrazu

FALSE && !(TRUE || FALSE)
## [1] FALSE

vyhodnocování skončí hned prvním FALSE, protože po jeho vyhodnocení výsledek jasný. Pokud byste použili zkratující formu na vektory, výsledek se bude týkat první položky vektoru:

c(T, F) && c(T,T)
## [1] TRUE

Vektorová funkce all() vrátí TRUE, pokud jsou všechny prvky vektoru TRUE; jinak vrátí FALSE. Vektorová funkce any() vrátí TRUE, pokud je aspoň jedna hodnota TRUE; jinak vrátí FALSE. (Jedná se tedy o logický součin a součet přes všechny prvky vektoru.) Funkce all.equal() a identical() byly představeny výše.