Začněte nyníZačněte zdarma

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

Zobrazit kurz

Pokyny k cvičení

  1. Vytvoř funkci improved_move(), která funguje podobně jako move(), ale používá &&.
  2. Pomocí microbenchmark() porovnej improved_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)
Upravit a spustit kód