เริ่มต้นใช้งานเริ่มต้นใช้งานได้ฟรี

ใช้ && แทน &

เพื่อตรวจสอบว่าลูกเต๋าทั้งสองลูกออกค่าเหมือนกันหรือไม่ ฟังก์ชัน move_square() ใช้คำสั่ง if ดังนี้

if (is_double[1] & is_double[2] & is_double[3]) {
    current <- 11 # Go To Jail - square 11 == Jail
}

ตัวดำเนินการ & จะประเมินค่าของทั้งสองอาร์กิวเมนต์เสมอ กล่าวคือ ถ้าเขียน x & y R จะคำนวณทั้ง x และ y ทุกครั้ง ซึ่งในบางกรณีไม่มีประสิทธิภาพ ตัวอย่างเช่น ถ้า x เป็น FALSE ผลลัพธ์ของ x & y จะเป็น FALSE อยู่แล้ว ไม่ว่าค่าของ y จะเป็นอะไรก็ตาม จึงไม่จำเป็นต้องเสียเวลาคำนวณ y ตัวดำเนินการ && ใช้ประโยชน์จากจุดนี้ โดยจะข้ามการคำนวณ y หากผลลัพธ์โดยรวมไม่เปลี่ยนแปลง

ในโค้ดนี้ หาก is_double[1] เป็น FALSE เราไม่จำเป็นต้องประเมินค่า is_double[2] หรือ is_double[3] อีกต่อไป ดังนั้นการเปลี่ยน & เป็น && จึงช่วยเพิ่มความเร็วได้

ข้อควรทราบคือ && ใช้ได้กับค่าตรรกะเดี่ยวเท่านั้น คือเวกเตอร์ตรรกะที่มีความยาว 1 (เช่นเดียวกับที่ส่งเข้าเงื่อนไข if) แต่ & สามารถใช้กับเวกเตอร์ที่มีความยาวมากกว่า 1 ได้ด้วย

แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร

การเขียน R Code อย่างมีประสิทธิภาพ

ดูคอร์ส

คำแนะนำการฝึกหัด

  1. สร้างฟังก์ชัน improved_move() ที่มีลักษณะคล้ายกับ move() แต่ใช้ && แทน
  2. ใช้ microbenchmark() เปรียบเทียบประสิทธิภาพของ improved_move() กับ move() เวอร์ชันก่อนหน้า

แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ

ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์

# 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)
แก้ไขและรันโค้ด