แยกข้อมูลด้วย keep() และ discard()
เราต้องการแบ่งผลลัพธ์ออกเป็นสองกลุ่ม ได้แก่ วันที่มีค่าเกิน 100 และวันที่มีค่าต่ำกว่า 100 โดยจะใช้ keep() และ discard() ร่วมกัน
ทำไมต้องใช้สองฟังก์ชัน? ใช้ฟังก์ชันเดียวไม่ได้หรือ? หรือสร้าง mapper ชื่อ is_less_than_hundred ขึ้นมาเลยไม่ดีกว่าหรือ?
ทำได้ แต่จะเสี่ยงต่อความผิดพลาดมากกว่า เพราะการสลับระหว่าง
keep()กับdiscard()ทำได้ง่ายกว่าการคัดลอกและวางโค้ด เมื่อใช้ทั้งสองฟังก์ชันร่วมกัน เราจำเป็นต้องมี mapper เพียงตัวเดียว นั่นหมายความว่าหากต้องการเปลี่ยน threshold เราแก้ไขแค่ที่เดียว ไม่ต้องแก้สองที่เหมือนกรณีที่มี mapper สองตัว
นี่คือหลักการที่ควรยึดถือเมื่อเขียนโค้ด นั่นคือเขียนโค้ดให้เป็นแบบที่หากต้องการเปลี่ยนแปลงสิ่งใด ก็แก้ไขเพียงครั้งเดียวก็พอ
all_visits ยังคงพร้อมใช้งานใน workspace ของคุณ
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
Functional Programming ระดับกลางด้วย purrr
คำแนะนำการฝึกหัด
- ใช้ฟังก์ชัน
set_names()กับall_visitsเพื่อเพิ่มชื่อวันลงไป แล้วเก็บผลไว้ในall_visits_named - สร้าง mapper ชื่อ
thresholdเพื่อทดสอบว่า.xมีค่าเกิน 100 หรือไม่ - สร้าง
group_overโดยเก็บเฉพาะองค์ประกอบที่มีค่าเกิน 100 - สร้าง
group_underโดยตัดทิ้งองค์ประกอบที่มีค่าเกิน 100
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
# Set the name of each subvector
day <- c("mon", "tue", "wed", "thu", "fri", "sat", "sun")
all_visits_named <- ___(all_visits, ~ ___(.x, ___))
# Create a mapper that will test if .x is over 100
threshold <- ___
# Run this mapper on the all_visits_named object: group_over
group_over <- ___(all_visits_named, ~ ___(.x, ___))
# Run this mapper on the all_visits_named object: group_under
group_under <- ___(all_visits_named, ~ ___(.x, ___))