Gunakan && alih-alih &
Untuk menentukan apakah kedua dadu bernilai sama, fungsi move_square() menggunakan pernyataan if.
if (is_double[1] & is_double[2] & is_double[3]) {
current <- 11 # Go To Jail - square 11 == Jail
}
Operator & akan selalu mengevaluasi kedua argumennya. Artinya, jika Anda mengetik x & y, R akan selalu mencoba menghitung nilai x dan y. Ada beberapa kasus ketika hal ini tidak efisien. Misalnya, jika x bernilai FALSE, maka x & y akan selalu FALSE, apa pun nilai y. Dengan demikian, Anda dapat menghemat sedikit waktu pemrosesan dengan tidak menghitungnya. Operator && memanfaatkan trik ini, dan tidak akan repot menghitung y jika tidak memengaruhi hasil keseluruhan.
Dalam kode ini, jika is_double[1] bernilai FALSE kita tidak perlu mengevaluasi is_double[2] atau is_double[3], sehingga kita bisa memperoleh peningkatan kecepatan dengan menukar & menjadi &&.
Satu hal yang perlu dicatat adalah && hanya bekerja pada nilai logika tunggal, yaitu vektor logika dengan panjang 1 (seperti yang Anda berikan ke kondisi if), sedangkan & juga bekerja pada vektor dengan panjang lebih dari 1.
Latihan ini adalah bagian dari kursus
Menulis Kode R yang Efisien
Petunjuk latihan
- Buat fungsi
improved_move(), yang mirip denganmove(), tetapi menggunakan&&. - Dengan menggunakan
microbenchmark(), bandingkanimproved_move()dengan versi sebelumnyamove().
Latihan interaktif praktis
Cobalah latihan ini dengan menyelesaikan kode contoh berikut.
# 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)