Usa && en lugar de &
Para determinar si ambos dados son iguales, la función move_square() usa sentencias if.
if (is_double[1] & is_double[2] & is_double[3]) {
current <- 11 # Go To Jail - square 11 == Jail
}
El operador & siempre evalúa ambos argumentos. Es decir, si escribes x & y, R siempre intentará averiguar qué son x e y. Hay casos en los que esto es ineficiente. Por ejemplo, si x es FALSE, entonces x & y siempre será FALSE, sin importar el valor de y. Por tanto, puedes ahorrar un poco de tiempo de procesamiento si no lo calculas. El operador && aprovecha este truco y no se molesta en calcular y si no afecta al resultado final.
En este código, si is_double[1] es FALSE, no necesitamos evaluar is_double[2] ni is_double[3], así que podemos ganar velocidad sustituyendo & por &&.
Ten en cuenta que && solo funciona con valores lógicos individuales, es decir, vectores lógicos de longitud 1 (como los que pasarías a una condición if), mientras que & también funciona con vectores de longitud mayor que 1.
Este ejercicio forma parte del curso
Escribir código R eficiente
Instrucciones del ejercicio
- Crea una función
improved_move(), similar amove(), pero que use&&. - Con
microbenchmark(), comparaimproved_move()con la versión anteriormove().
Ejercicio interactivo práctico
Prueba este ejercicio y completa el código de muestra.
# 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)