ComeçarComece de graça

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

Ver curso

Instruções do exercício

  1. Crie uma função improved_move(), semelhante a move(), mas usando &&.
  2. Usando microbenchmark(), compare improved_move() com a versão anterior move().

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)
Editar e executar o código