Use && em vez de &
Para determinar se os dois dados são iguais, a função move_square() usa instruções if.
if (is_double[1] & is_double[2] & is_double[3]) {
current <- 11 # Go To Jail - square 11 == Jail
}
O operador & sempre avalia ambos os seus argumentos. Ou seja, se você digitar x & y, o R sempre vai tentar calcular o que são x e y. Em alguns casos isso é ineficiente. Por exemplo, se x é FALSE, então x & y sempre será FALSE, independentemente do valor de y. Assim, você pode economizar um pouco de processamento evitando esse cálculo. O operador && aproveita esse truque e não se dá ao trabalho de calcular y quando isso não altera o resultado final.
Neste código, se is_double[1] for FALSE, não precisamos avaliar is_double[2] nem is_double[3], então podemos ganhar velocidade trocando & por &&.
Um ponto importante: && funciona apenas com valores lógicos únicos, isto é, vetores lógicos de comprimento 1 (como você passaria para uma condição if), enquanto & também funciona com vetores de comprimento maior que 1.
Este exercício faz parte do curso
Escrevendo código R eficiente
Instruções do exercício
- Crie uma função
improved_move(), semelhante amove(), mas usando&&. - Usando
microbenchmark(), compareimproved_move()com a versão anteriormove().
Exercício interativo prático
Experimente este exercício completando este código de exemplo.
# 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)