vapply() เทียบกับ sapply()
ในตัวอย่างก่อนหน้า sapply() ไม่สามารถย่อผลลัพธ์ได้ เนื่องจากคอลัมน์ date ใน market_crash2 มีสองคลาส (POSIXct และ POSIXt) แต่สังเกตว่าไม่มีข้อผิดพลาดเกิดขึ้นเลย! หากฟังก์ชันที่คุณเขียนคาดหวังว่า sapply() จะคืนค่าเป็นเวกเตอร์ที่ย่อแล้ว พฤติกรรมนี้อาจทำให้สับสนได้
เพื่อรับมือกับปัญหานี้ R มีฟังก์ชัน apply ที่เข้มงวดกว่าชื่อว่า vapply() ซึ่งมีอาร์กิวเมนต์พิเศษ FUN.VALUE ให้ระบุประเภทและความยาวของผลลัพธ์ที่ต้องการจากการเรียกฟังก์ชันแต่ละครั้ง
หากคาดหวังว่าผลลัพธ์ของ class() จะเป็นเวกเตอร์ประเภท character ที่มีความยาว 1 สามารถระบุได้ด้วย vapply() ดังนี้:
vapply(market_crash, class, FUN.VALUE = character(1))
dow_jones_drop date
"numeric" "Date"
ตัวอย่างอื่นของ FUN.VALUE เช่น numeric(2) หรือ logical(1) โดย market_crash2 ถูกกำหนดค่าไว้ให้แล้ว
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
R ระดับกลางสำหรับการเงิน
คำแนะนำการฝึกหัด
- ใช้
sapply()เพื่อหาคลาสด้วยclass()ของแต่ละองค์ประกอบในmarket_crash2สังเกตว่าผลลัพธ์ที่ได้เป็นลิสต์ ไม่ใช่ข้อผิดพลาด - ใช้
vapply()กับmarket_crash2เพื่อหาคลาสด้วยclass()โดยระบุFUN.VALUE = character(1)และสังเกตว่าจะเกิดข้อผิดพลาดขึ้นอย่างเหมาะสม
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
# Market crash with as.POSIXct()
market_crash2 <- list(dow_jones_drop = 777.68,
date = as.POSIXct("2008-09-28"))
# Find the classes with sapply()
___
# Find the classes with vapply()
___