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
Instrucțiuni pentru exercițiu
- Creează o funcție
improved_move(), similară cumove(), dar care folosește&&. - 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)