การใช้งาน parSapply()
เราเคยเล่นเกมต่อไปนี้:
- เริ่มต้น:
total = 0 - ทอยลูกเต๋า 1 ลูก แล้วนำค่าที่ได้บวกเข้ากับ
total - ถ้า
totalเป็นเลขคู่ ให้รีเซ็ตtotalเป็นศูนย์ - ถ้า
totalมากกว่า 10 เกมจะจบลง
สามารถจำลองเกมนี้ได้ด้วยฟังก์ชัน play():
play <- function() {
total <- no_of_rolls <- 0
while(total < 10) {
total <- total + sample(1:6, 1)
# If even. Reset to 0
if(total %% 2 == 0) total <- 0
no_of_rolls <- no_of_rolls + 1
}
no_of_rolls
}
หากต้องการจำลองเกม 100 ครั้ง สามารถใช้ลูป for หรือ sapply() ได้:
res <- sapply(1:100, function(i) play())
นี่คือโค้ดที่เหมาะมากสำหรับการรันแบบ parallel!
หากต้องการทำให้ฟังก์ชันพร้อมใช้งานบนคลัสเตอร์ ให้ใช้ฟังก์ชัน clusterExport() โดยรับคลัสเตอร์และชื่อฟังก์ชันในรูปแบบ string:
clusterExport(cl, "some_function")
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
การเขียน R Code อย่างมีประสิทธิภาพ
คำแนะนำการฝึกหัด
ฟังก์ชัน play() ถูกกำหนดไว้ใน workspace ของคุณแล้ว
- สร้างคลัสเตอร์ด้วย
makeCluster()โดยกำหนดจำนวนคอร์เป็น 2 แล้วเก็บผลลัพธ์ไว้ในตัวแปรcl - Export ฟังก์ชัน
play()ไปยังคลัสเตอร์ - เขียน
sapply()ข้างต้นใหม่ให้เป็นparSapply() - หยุดคลัสเตอร์ด้วย
stopCluster()
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
library("parallel")
# Create a cluster via makeCluster (2 cores)
cl <- ___
# Export the play() function to the cluster
___
# Re-write sapply as parSapply
res <- sapply(1:100, function(i) play())
# Stop the cluster
___