ÎncepețiÎncepe gratuit

Folosește && în loc de &

Pentru a determina dacă ambii zaruri sunt identici, funcția move_square() folosește instrucțiuni if.

if (is_double[1] & is_double[2] & is_double[3]) {
    current <- 11 # Go To Jail - square 11 == Jail
}

Operatorul & evaluează întotdeauna ambele argumente. Adică, dacă scrii x & y, R va încerca mereu să calculeze atât x, cât și y. Există situații în care acest lucru este ineficient. De exemplu, dacă x este FALSE, atunci x & y va fi mereu FALSE, indiferent de valoarea lui y. Prin urmare, poți economisi timp de procesare dacă eviți calcularea lui y atunci când nu este necesar. Operatorul && profită de acest avantaj și nu mai calculează y dacă rezultatul final nu depinde de el.

În acest cod, dacă is_double[1] este FALSE, nu este nevoie să evaluăm is_double[2] sau is_double[3], deci putem câștiga viteză înlocuind & cu &&.

Un lucru important de reținut: && funcționează doar cu valori logice individuale, adică vectori logici de lungime 1 (cum ai folosi într-o condiție if), în timp ce & funcționează și cu vectori de lungime mai mare.

Acest exercițiu face parte din cursul

Scrierea codului R eficient

Vezi cursul

Instrucțiuni pentru exercițiu

  1. Creează o funcție improved_move(), similară cu move(), dar care folosește &&.
  2. Folosind microbenchmark(), compară improved_move() cu versiunea anterioară move().

Exercițiu interactiv practic

Încearcă acest exercițiu completând acest cod de exemplu.

# 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)
Editează și rulează codul