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.