Links
Archives
บล็อกเพื่อแลกเปลี่ยนเรียนรู้ สำหรับนักพัฒนาฟังก์ชันสำหรับ R ในประเทศไทย
สนับสนุนโดย สำนักงานกองทุนสนับสนุนการวิจัย (สกว)
25 พฤษภาคม 2548
การ build package ใน R
โดยปกติการใช้งาน package ใน R สำหรับคอมพิวเตอร์ Linux และ Macintosh นั้น ผู้ใช้สามารถ install package จาก source file ที่บีบอัดข้อมูลในรูปแบบ tar.gz ได้โดยตรง นั่นคือผู้สร้าง package ไม่ต้อง build ให้ แต่ผู้ใช้เป็นคน build package จาก source file เองได้ แต่การทำงานบน Windows นั้นจะต่างออกไป คือผู้สร้างจะต้อง build ให้ แล้ว zip package นั้นเพื่อให้ผู้ใช้ unzip เอาไปใช้อีกต่อหนึ่ง ทั้งนี้เพราะกระบวนการ build บน Windows นั้นค่อนข้างยุ่งยาก เนื่องจากจะต้องทำงานเลียนแบบการทำงานบน Unix platform (Linux และ Macintosh เป็น Unix อยู่แล้ว จึงทำได้ทันที) ซึ่งจะกล่าวต่อไปในบทนี้
1. เครื่องมือที่ต้องใช้
มี web site ที่สนับสนุนการทำงานนี้โดยเฉพาะ คือ http://www.murdoch-sutherland.com/Rtools/ ซึ่งมีแฟ้มเครื่องมือสำหรับการ build บริการให้ ผู้สนใจอาจเข้าไปศึกษารายละเอียดเพิ่มเติมของการ build package บน Windows ที่ไม่ได้อธิบายไว้ในบทนี้ได้ที่ web site นี้ แต่ในขั้นต้นขอให้ download โปรแกรมเครื่องมือมาก่อนจาก http://www.murdoch-sutherland.com/Rtools/tools.zip จากนั้น unzip แฟ้มนี้ไปใส่ในโฟลเดอร์ ../R/rw20xx/bin
นอกจากแฟ้มเครื่องเหล่านี้แล้ว ยังต้อง download โปรแกรม ActivePerl จาก http://www.activestate.com/Products/ActivePerl/Download.html ซึ่งเป็นโปรแกรมที่มีอยู่เป็นปกติบนเครื่อง Linux และ Macintosh อยู่แล้ว แต่ไม่มีอยู่บน Windows ActivePerl เป็นโปรแกรมที่ใช้ในการแปลคำสั่งแฟ้ม Rd เพื่อสร้างแฟ้มข้อความช่วยเหลือนั่นเอง เมื่อได้มาแล้ว ให้ติดตั้งตามขั้นตอนซึ่งจะใช้เวลาในการติดตั้งนานสักเล็กน้อย จากนั้น restart เครื่องคอมพิวเตอร์ โปรแกรม ActivePerl จะถูกเรียกทำงานอยู่เบื้องหลังทุกครั้งเมื่อเปิดเครื่องคอมพิวเตอร์
จากนั้นต้องตั้งค่าตัวแปร environment ที่ชื่อ TMPDIR ให้เป็นโฟลเดอร์ที่มีอยู่จริง เช่น C:\TEMP หรือ C:\WINDOWS\TEMP (หากยังไม่มีก็สร้างขึ้นใหม่) ทั้งนี้จะเป็นโฟลเดอร์ที่ ActivePerl จะใช้สำหรับใส่แฟ้มชั่วคราวที่สร้างขึ้นระหว่างการทำงานต่างๆ เพื่อจะได้ไม่ไปปะปนอยู่กับ โฟลเดอร์ทำงานตามปกติ สามารถทำได้โดยไปที่ Control Panel แล้วเลือก System กดปุ่ม Advanced ที่ด้านบน แล้วกดปุ่ม Environment Variables (ที่ด้านล่างเหนือปุ่ม OK) เมื่อปรากฏหน้าต่างขึ้น ให้ดูในช่อง System variables ด้านล่าง แล้วเลื่อนลงไปจนพบชื่อ TMPDIR หากพบก็ไม่ต้องทำอะไร แต่หากไม่พบให้กดปุ่ม New จะเกิดหน้าต่างเล็กๆ ขึ้น ช่อง Variable name ให้ใส่ TMPDIR และช่องด้านล่างให้ใส่ C:\TEMP หรือ C:\WINDOWS\TEMP ตามที่สร้างไว้หรือมีอยู่แล้วดังกล่าวข้างต้น
นอกจากนี้ยังมีอีกโปรแกรมหนึ่งที่ต้อง download มาคือ htmlhelp.exe ทั้งนี้เพื่อใช้สร้างแฟ้มช่วยเหลือชนิด chtml นั้นเอง โดย download จาก link ที่ให้ไว้ที่ http://www.murdoch-sutherland.com/Rtools/ หรือ download ได้โดยตรงที่ http://msdn.microsoft.com/library/default.asp?url=/library/en-us/htmlhelp/html/hwmicrosofthtmlhelpdownloads.asp หรือที่ http://office.microsoft.com/en-gb/assistance/HA011362801033.aspx ก็ได้ (link เหล่านี้อาจเปลี่ยนแปลงได้ ถ้าไม่สามารถเข้าได้ ให้ตรวจสอบ link ใหม่ที่ web site ของ Murdoch หรือใช้ search engine เช่น google ค้นหา link ใหม่โดยใช้คำหลักว่า htmlhelp.exe) ติดตั้งโปรแกรมตามขั้นตอน
2. วิธี build R package
สร้างโฟลเดอร์ package ตามที่ได้อธิบายไว้แล้วในเรื่อง “การสร้าง package ใน R” หรือตามรายละเอียดที่บรรยายใน “Writing R Extensions” คัดลอกโฟลเดอร์นี้ทั้งหมดไปใส่ในโฟลเดอร์ ../R/rw20xx/bin ซึ่งจะเป็นโฟลเดอร์ทำงานในการ build บนเครื่อง Windows
ในที่นี้ขอแทรกเรื่องการ build package บน Linux และ Macintosh สักเล็กน้อย บน Linux นั้น หากจำ build หรือ install package ใดๆ ต้อง login เป็น root แล้วคัดลอกโฟลเดอร์ที่ต้องการทำงานไปไว้ที่ root home จากนั้นเรียก terminal ขึ้นมา หากต้องการ install คือติดตั้ง package เข้าไปใน R ทำโดยพิมพ์คำสั่งที่ prompt ดังนี้
R CMD INSTALL package_name
การทำงานนี้ใช้เมื่อแน่ใจว่าทุกอย่างที่สร้างขึ้นถูกต้องหมดแล้วทั้งสิ้น แต่ในการพัฒนา package จริงๆ นั้น จะต้องตรวจสอบก่อนว่าทุกอย่างที่เขียนใน package และแฟ้มความช่วยเหลือนั้นสามารถทำงานได้ถูกต้องหรือไม่ ซึ่ง R ได้มีคำสั่งที่ใช้ทดสอบการทำงานไว้ให้แล้ว โดยการใช้คำสั่ง
R CMD check package_name
เมื่อออกคำสั่งนี้ จะเกิดโฟลเดอร์ชื่อ package_name.Rcheck ขึ้น ภายในนั้นจะมีโฟลเดอร์ที่มีชื่อเดียวกับ package นั้นอยู่ หากไม่เกิดปัญหาใดๆ ในการ build เมื่อเข้าไปดูจะเห็นแฟ้มและโฟลเดอร์ย่อยต่างๆ คล้าย package ที่เป็นต้นกำเนิด แต่หากดูให้ลึกถึงข้อความในแฟ้มจะเป็นเปลี่ยนไป และมีแฟ้มเพิ่มขึ้น โดยจะมีแฟ้มชื่อ DESCRIPTION ซึ่งจะมีข้อความต่างไปจากต้นฉบับเดิมเล็กน้อย, CONTENTS, INDEX, และ NAMESPACE ถ้าในโฟลเดอร์เดิมมี NAMESPACE อยู่ด้วย และมีโฟลเดอร์ต่อไปนี้ data, help, html, latex, man, Meta, R, และ R-ex ในที่นี้จะไม่กล่าวถึงสิ่งที่บรรจุในโฟลเดอร์เหล่านี้ แต่โดยสรุปคือเป็นโครงสร้างและข้อมูลที่ใช้ทำงานจริงใน library folder ของ R นั่นเอง (ซึ่งแม้ว่าคำสั่ง R CMD INSTALL จะไม่แสดงแฟ้มและโฟลเดอร์เหล่านี้ให้เห็นที่โฟลเดอร์ root แต่คำสั่งจะติดตั้งแฟ้มและโฟลเดอร์เหล่านี้ลงใน library folder ทำงานของ R ทันที เพราะระบบปฏิบัติการ Linux ไม่ต้องการให้ผู้ใช้เข้าไปจัดการในส่วนนี้ แต่ระบบจะจัดการให้เอง)
บนระบบปฏิบัติการ Macintosh ก็เช่นเดียวกัน ให้คัดลอกโฟลเดอร์ package ไปไว้ที่ root (ชื่อ user ของผู้ใช้ ไม่ใช่ที่ไดเรกตอรีหลักของ hard disk เช่นผู้ใช้ชื่อ user ก็คัดลอกไปที่โฟลเดอร์ชื่อ user ไม่ใช่ที่ hard disk) จากนั้นเรียกโปรแกรม terminal จากโฟลเดอร์ Utilities ในโฟลเดอร์ Application นั่นคือขณะนี้ได้เข้า terminal mode เช่นเดียวกับ Linux แล้ว เมื่อพิมพ์ ls ที่ prompt ใน terminal จะเห็นโฟลเดอร์ package จากนั้นใช้คำสั่งเช่นเดียวกับที่กล่าวมาแล้วข้างต้นบน Linux นั่นเอง
ในการพิมพ์คำสั่งบน Linux หรือ Macintosh ขอให้พิมพ์ตัวพิมพ์เล็กหรือใหญ่ตามที่เขียนไว้ข้างต้นนี้ เพราะบนระบบปฏิบัติการตระกูล Unix นั้น อักษรตัวใหญ่ต่างจากอักษรตัวเล็ก
ที่กล่าวถึงระบบ Linux ก่อนเช่นนี้ก็เนื่องจากการทำงานบน Windows จะทำงานเลียบแบบระบบ Linux นั่นเอง ซึ่งในขั้นแรกจะต้องเข้า DOS mode โดยที่ Start Menu ให้เลือก All Programs --> Accessories --> Command Prompt แล้วเปลี่ยน directory โดยใช้คำสั่ง cd ไปจนถึง ../R/rw20xx/bin ที่ได้คัดลอกโฟลเดอร์ package ไปไว้ก่อนหน้าแล้ว
จากนั้นที่ prompt พิมพ์คำสั่ง
Rcmd check package_name
ซึ่งเป็นการทำงานดังที่ได้กล่าวไว้ข้างต้นเช่นเดียวกับบนระบบ Linux นั่นเอง แต่สังเกตว่า R CMD คราวนี้จะพิมพ์ติดกัน และสามารถพิมพ์ตัวเล็กหรือตัวใหญ่ก็ได้
ในขั้นตอนการ build ด้วย check นั้น จะเกิดโฟลเดอร์ชื่อ package_name.Rcheck เช่นเดียวกับที่กล่าวข้างต้น โดยโฟลเดอร์นี้จะอยู่ที่ ../R/rw20xx/bin นั่นเอง แต่จะพบว่ามีการรายงานความผิดพลาดเกิดขึ้น ในขณะที่คำสั่งได้สร้างโฟลเดอร์ชื่อ chm ในโฟลเดอร์ package อันเก่าที่เป็นต้นฉบับ ในโฟลเดอร์นี้จะเห็นแฟ้มความช่วยเหลือที่มีนามสกุล html และจะมีหนึ่งแฟ้มที่มีชื่อ package_name.hhp
เมื่อถึงขั้นตอนนี้ ให้เปิดโปรแกรม HTML Help Workshop จาก desktop alias หรือจาก Start Menu ก็ได้ แล้วเลือกที่ File --> Open แล้วเปิดแฟ้มที่ชื่อ package_name.hhp นั้น จากนั้นกลับไปที่ File à Compile… เพื่อสร้างแฟ้มความช่วยเหลือที่มีชื่อเป็น package_name.chm ไว้ในโฟลเดอร์ chm นี้ เมื่อเสร็จแล้วปิดโปรแกรม HTML Help Workshop ได้
ทีนี้กลับมา build package อีกครั้งด้วยคำสั่ง
Rcmd check package_name
ถ้าคำสั่งและแฟ้มความช่วยเหลือทั้งหมดถูกต้อง คราวนี้คำสั่งจะ build ทุกอย่างได้โดยไม่มีข้อผิดพลาด และจะมีโฟลเดอร์ย่อยชื่อ chtml เพิ่มขึ้นมาจากการ build บน Linux หรือ Macintosh
ในระหว่างการ build หากมีข้อผิดพลาดอย่างใดเกิดขึ้น ขอให้อ่านข้อความแจ้งความผิดพลาดให้ละเอียด เพื่อกลับไปแก้ไขข้อผิดพลาดนั้น แล้วกลับมา build ใหม่อีกครั้ง แต่อย่าลืมว่าคราวนี้มีโฟลเดอร์ package ถึงสามโฟลเดอร์ คือโฟลเดอร์ดั้งเดิมที่สร้างขึ้นในการพัฒนาคำสั่ง โฟลเดอร์ package ที่คัดลอกมาไว้ที่ /bin และโฟลเดอร์ package ใน package_name.Rcheck ไม่ต้องไปสนใจโฟลเดอร์ package ใน .Rcheck แต่อย่างใด แต่ทุกครั้งที่แก้ไขต้นฉบับคำสั่งหรือแฟ้มความช่วยเหลือ ควรแก้ไขใน /bin และเมื่อทุกอย่างถูกต้องคือ build ผ่านหมดแล้ว ให้สำเนาโฟลเดอร์นี้ทั้งหมดกลับไปไว้ที่เดิมที่พัฒนา package นั้นด้วย มิฉะนั้นจะสับสนในภายหลังได้ เพราะอาจมีบางคำสั่งใน package ต้นฉบับกับที่ build แล้วแตกต่างกันได้ และนอกจากนี้ยังแนะนำให้สำเนาโฟลเดอร์ package_name.Rcheck เก็บไว้ทั้งโฟลเดอร์ อย่าสำเนาเก็บแต่เฉพาะโฟลเดอร์ package ภายในมาเก็บไว้ เพราะอย่างที่บอกแล้วว่าโฟลเดอร์ package ที่สร้างขึ้นใน .Rcheck นั้นไม่เหมือนกับ package ต้นฉบับ อาจทำให้สับสนได้ว่า package ที่ build แล้วนี้เป็นต้นฉบับได้ แล้วไปลบต้นฉบับจริงทิ้งเสีย การฟื้นต้นฉบับทั้งหมดกลับมานั้นทำได้ยากมาก
อีกประการหนึ่ง หากมีการแก้ไขแฟ้มความช่วยเหลือชนิด .Rd ต้องลบโฟลเดอร์ chm ในโฟลเดอร์ package ที่เป็นต้นฉบับใน /bin ด้วยเสมอ ที่จริงแฟ้มที่สำคัญที่สุดในนั้นคือ package_name.chm ซึ่งหากในระหว่างการ build นั้น โปรแกรม Rcmd พบแฟ้มนี้อยู่ในโฟลเดอร์ chm คำสั่งจะข้ามการแก้ไขทั้งแฟ้มชนิด .htm และ .chm ไปเลย ซึ่งจะทำให้ได้แฟ้มความช่วยเหลือเก่าที่ยังไม่ได้แก้ไขแต่อย่างใด ดังนั้น หากมีการแก้ไขแฟ้มความช่วยเหลือชนิด .Rd ให้ลบโฟลเดอร์ chm ทิ้งเสียด้วย และจะต้องเรียกคำสั่งในการ build สองครั้ง และต้องเรียกโปรแกรม HTML Help Workshop ใหม่ทุกครั้ง แม้ว่าจะเป็นการเสียเวลา แต่ถ้าหากไม่ทำ แฟ้มความช่วยเหลือที่ได้จะไม่ถูกต้อง
เมื่อการ build เรียบร้อยแล้ว ให้เข้าไปในโฟลเดอร์ package_name.Rcheck แล้ว zip โฟลเดอร์ package ในนั้นด้วยโปรแกรม winzip หรือ 7-Zip ก็ได้ แล้วแฟ้ม package_name.zip ที่ได้นี้จะเป็นแฟ้มที่สามารถแจกจ่ายให้ผู้ใช้งาน R บนระบบ Windows ได้นั่นเอง (แต่ผู้ใช้บนระบบ Linux และ Macintosh จะใช้งานแฟ้มนี้ไม่ได้)
สำหรับการ build บน Linux และ Macintosh นั้น เมื่อ check ผ่านหมดทุกขั้นตอนดังนี้แล้ว จะต้องเรียกคำสั่งต่อไปนี้ที่ prompt
R CMD build package_name
เป็นการสร้างแฟ้มชื่อ package_name.tar.gz ขึ้นนั่นเอง บน Windows นั้นก็สามารถสร้างแฟ้มนี้ได้โดยออกคำสั่งต่อไปนี้ที่ DOS prompt
Rcmd build package_name
ในการแจกจ่ายแฟ้ม package สำหรับระบบ Linux และ Macintosh นั้น จะแจกจ่ายเป็นแฟ้ม package_name.tar.gz เมื่อผู้ใช้ต้องการจะติดตั้ง ให้ไปที่ terminal แล้วเรียกคำสั่ง R CMD INSTALL เพื่อติดตั้ง
ส่วนบนระบบ Windows ให้แจกจ่าย package เป็นแฟ้ม package_name.zip ผู้ใช้จะติดตั้งโดยเข้า R console ก่อน แล้วเลือกเมนู Packages --> Install package(s) from local zip files…