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
)

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