Använd && i stället för &
För att avgöra om båda tärningarna visar samma värde använder funktionen move_square() if-satser.
if (is_double[1] & is_double[2] & is_double[3]) {
current <- 11 # Go To Jail - square 11 == Jail
}
Operatorn & utvärderar alltid båda sina argument. Om du skriver x & y försöker R alltid beräkna både x och y. Det finns situationer där det är onödigt. Om x till exempel är FALSE kommer x & y alltid att vara FALSE, oavsett värdet på y. Du kan alltså spara lite beräkningstid genom att inte beräkna y i det fallet. Operatorn && utnyttjar just detta – den beräknar inte y om det inte påverkar slutresultatet.
I den här koden behöver vi inte utvärdera is_double[2] eller is_double[3] om is_double[1] är FALSE. Vi kan därför snabba upp koden genom att byta ut & mot &&.
En sak att tänka på är att && bara fungerar med enskilda logiska värden, det vill säga logiska vektorer av längd 1 (som du skickar in i ett if-villkor), medan & även fungerar med vektorer av längd större än 1.
Den här övningen är en del av kursen
Effektiv R-kod
Övningsinstruktioner
- Skapa en funktion
improved_move()som liknarmove()men använder&&. - Använd
microbenchmark()för att jämföraimproved_move()med den tidigare versionenmove().
Interaktiv övning med praktiskt arbete
Testa den här övningen genom att slutföra den här exempelkoden.
# 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)