DataRockie

รู้จักกับ Control Flow ทั้งสามแบบในภาษา R

control flow คือ basic statement (หรือ keyword) ที่ใช้ควบคุมพฤติกรรมของโปรแกรมที่เราเขียนใน R หลักๆจะมีอยู่สามแบบคือ

  • if-else
  • for loop
  • while loop

ถ้าเข้าใจหลักการ control flow ทั้งสามแบบจะช่วยให้เราอ่านโค้ด R ที่คนอื่นโพสต์บนอินเตอร์เน็ตได้ง่ายขึ้นมาก และผลพลอยได้คือจะช่วยให้เราเขียน R เป็นเร็วขึ้นด้วย

ตัวอย่าง control flow diagram ด้านล่างจำลองสถานการณ์เราพกเงิน $50 เข้าคาสิโนโยนลูกเต๋าเสี่ยงดวง เราจะเล่นไปเรื่อยๆจนกว่าเงินจะหมด (broke) หรือโชคดีชนะได้เงิน $100 (won 100) แล้วค่อยกลับบ้าน (END)

Image result for control flow
ที่มา – Learning JavaScript 3rd Edition by Todd Brown (link)

Note – เนื้อหาในบทความวันนี้สามารถประยุกต์ใช้ได้กับทุกภาษาตั้งแต่ R, Python, Java, Scala, C เป็นต้น เพราะทุกภาษามี control flow! มันคือ building block ที่สำคัญเวลาเราเริ่มเขียนโปรแกรมใหม่ๆ

if-else

เราใช้ if เพื่อทดสอบเงื่อนไข โค้ดด้านล่างเป็น template การเขียน if-else ง่ายๆทดสอบหนึ่งเงื่อนไข ใน R เราจะเขียนเงื่อนไขในวงเล็บแบบนี้ (..condition..)

  • ถ้า x > 50 ให้ปริ้นประโยค “Awesome”
  • ถ้า x ≤ 50 ให้ปริ้นประโยค “Try again”
# assign a number between 0-100 to x
x <- 89

# create a condition (if-else)
if(x > 50){
  print("Awesome") 
} else {
  print("Try again") 
}

Quiz – ในตัวอย่างด้านบนเรา assign x เท่ากับ 89 ถ้าเรารันโค้ดนี้ R จะแสดงข้อความไหนใน console?

ภาษา R จะใช้เครื่องหมายปีกกาสร้างบล๊อคเวลาเขียนโปรแกรม ในตัวอย่างด้านบนเราเขียนสองบล๊อคคือ if block และ else block สิ่งที่เราอยากให้โปรแกรมทำจะถูกเขียนอยู่ใน {} ของ block นั้นๆ

for loop

สมมติเรามี vector ที่เก็บชื่อเพื่อนเราไว้สามคนคือ Joe, Anny, Mary และเราอยากจะกล่าวทักทายเพื่อนๆทั้งสามคนด้วยข้อความนี้ “Hello .. name .. !” เราสามารถเขียน for loop ให้ R ส่งข้อความทักทายเพื่อนแต่ละคน

# we have three friends
friends <- c("Joe", "Anny", "Mary")

# say hi to all friends
for(name in friends){
  print(paste0("Hello ", name, "!"))
}

while loop

while loop เป็นการกำหนดจำนวนรอบ i.e. iteration ของโปรแกรมที่เราเขียน เช่น จงทำสิ่งนี้จนกว่าเงื่อนไขนี้จะเป็นจริงหรือรันโปรแกรม 100 รอบ ตัวอย่างด้านล่างเราสั่งให้ R ปริ้นข้อความ “The value of x is …” ไปเรื่อยๆจนเงื่อนไข (x > 0) จะเป็น FALSE

# assign a value to x
x <- 10

# while x > 0, print its value in console
while(x > 0){
  print(paste0("The value of x is ", x))
  # we must update the value of x
  # otherwise, we'll get stuck in the infinite loop (never ends)
  x <- x - 1
}

โค้ด line สุดท้าย x <- x-1 สำคัญมากในการเขียน while loop เราต้องอัพเดทค่าของตัวแปร x ที่เราเขียนเป็นเงื่อนไข ไม่งั้นโปรแกรมจะติดอยู่ใน infinite loop (ไม่มีวันจบ) เพราะ x จะมีค่ามากกว่าศูนย์เสมอ

Control Flow Inside Function

ความรู้เรื่อง control flow มีประโยชน์มากเวลาเราเขียน function ไว้ใช้งานเอง ตัวอย่างด้านล่างเราเขียนฟังชั่น num_check() ไว้ใช้ตรวจสอบว่า input เป็นเลขศูนย์ เลขคู่ หรือว่าเลขคี่ ใช้ if-else ง่ายๆเพื่อควบคุมโปรแกรม

num_check <- function(number){
  if(number == 0){
    return("The number is zero.")
  } else if(number %% 2 == 0){
    return("The number is even.")
  } else {
    return("The number is odd.")
  }
}

ลองทดสอบฟังชั่น num_check() กับเลข 10, 13, 0

num_check(10) # even
num_check(13) # odd
num_check(0) # zero

Another Example

function คือหัวใจสำคัญของการเขียนโปรแกรมใน R ลองดูอีกหนึ่งตัวอย่าง error_function() รับ 3 arguments คือ actual, prediction และ threshold ส่วน output คือ % accuracy ที่ได้จากการเปรียบเทียบ mean(actual == prediction)

เราใช้ if-else เพิ่มลูกเล่นให้กับฟังชั่นนี้ ถ้า accuracy >= threshold ที่เรากำหนดให้แสดงผล % ใน console แต่ถ้าไม่ผ่าน threshold ให้แสดงข้อความ “The accuracy is below our acceptable threshold”

# define our function
error_function <- function(actual, prediction, threshold){
  accuracy <- round(mean(actual == prediction) * 100, 2)
  if(accuracy >= threshold){
    return(paste0("The accuracy is ", accuracy, "%"))
  } else {
    return(paste0("The accuracy is below our acceptable threshold"))
  }
}

ทุกครั้งที่เขียนฟังชั่นเสร็จ ให้เราทดสอบมันก่อนเสมอว่าทำงานได้อย่างที่เราต้องการหรือเปล่า

# test this function
set.seed(98)
actual <- rbinom(100, 1, 0.8)
prediction <- rbinom(100, 1, 0.8)
threshold <- 60
error_function(actual, prediction, threshold)

Key Takeaway

  • control flow ใน R มีอยู่สามแบบคือ if-else, for loop และ while loop
  • control flow มีประโยชน์มากเวลาเขียน function ใช้เอง
  • แต่ละแบบมีวิธีการใช้ที่แตกต่างกัน ขึ้นอยู่กับสถานการณ์ เลือกใช้ให้ถูก
  • { } ในภาษา R อาจจะดูรกไปหน่อย แต่เขียนบ่อยๆเด๋วชิน 😛

Leave a Reply