Použij && místo &
Pro zjištění, zda padly stejná čísla na všech kostkách, používá funkce move_square() podmínky if.
if (is_double[1] & is_double[2] & is_double[3]) {
current <- 11 # Go To Jail - square 11 == Jail
}
Operátor & vždy vyhodnotí oba své argumenty. To znamená, že pokud napíšeš x & y, R se vždy pokusí zjistit hodnoty x i y. V některých případech to ale není efektivní. Pokud je například x rovno FALSE, pak x & y bude vždy FALSE, bez ohledu na hodnotu y. Výpočet y tedy není potřeba a zbytečně zabírá čas. Operátor && toho využívá – pokud výsledek y na výsledku nic nezmění, vůbec ho nepočítá.
V tomto kódu, pokud je is_double[1] FALSE, není potřeba vyhodnocovat is_double[2] ani is_double[3]. Záměnou & za && tak můžeme kód zrychlit.
Důležitá poznámka: && funguje pouze s jednotlivými logickými hodnotami, tedy s logickými vektory délky 1 (jako ty, které se předávají do podmínky if), zatímco & pracuje i s vektory delšími než 1.
Toto cvičení je součástí kurzu
Efektivní kód v R
Pokyny k cvičení
- Vytvoř funkci
improved_move(), která funguje podobně jakomove(), ale používá&&. - Pomocí
microbenchmark()porovnejimproved_move()s původní verzímove().
Interaktivní cvičení na vyzkoušení si v praxi
Vyzkoušejte si toto cvičení dokončením tohoto ukázkového kódu.
# Example data
is_double
# Define the previous solution
move <- function(is_double) {
if (is_double[1] & is_double[2] & is_double[3]) {
current <- 11 # Go To Jail
}
}
# Define the improved solution
improved_move <- function(is_double) {
if (is_double[1] ___ is_double[2] ___ is_double[3]) {
current <- 11 # Go To Jail
}
}
# microbenchmark both solutions
# Very occassionally the improved solution is actually a little slower
# This is just random chance
microbenchmark(___, ___, times = 1e5)