2014年8月29日 星期五

利用 R-Studio 配合 Rcpp Package 建立包含 C/C++ Code 的 R Package (Build R Package Including C/C++ Code by Using R-Studio and Rcpp Package)

在「利用 R-Studio 建立 R Package」一文中提到用簡單的方式一步步建立 package 。然而,若所建構的函式,是用 R code 所撰寫,在執行的效率上,相較於用 C/C++ code 來撰寫,會來的較沒效率。若所撰寫的演算法稍微複雜一點或甚至遇到較大量的資料,則 R code 的優勢便削減許多。為了避免 R code 在運算時的低效率特性,我們可將一部份較為複雜的演算法的 R code 轉寫為 C/C++ code 。如此便可大大的增加其運算的效率。

下圖為筆者將同一套演算法的 R code 改寫為 C code 後,跑效能測試後的比較圖。很明顯可以看出,無論是何種 condition , C code  的效能遠比 R code 要來的好很多!

而過去若要將 C/C++ code 包進 package 中,不僅要建立 src 資料、編寫 NAMESPACE 、針對 C/C++ code 進行 compile 等等繁複的程序。在過程中,又常出現許多五花八門的錯誤訊息,讓人摸不著頭緒。所幸,由 Dirk Eddelbuettel, et al. 所發展的 Rcpp package 被整合在 R-Studio 中,讓我們可以用較為簡單的方式,建立一個含有 C/C++ code 的套件。當然,如果您早已習慣 R 原有的操作介面,您也可以參考「 Writing a package that uses Rcpp 」這篇手冊。那麼,以下我們便以 R-Studio 的介面,帶大家一步步邁向目標。

環境說明:
處理器:Intel(R) Core(TM)2 Qual CPU Q9550 @ 2.83 GHz 2.83 GHz
記憶體:8.00 GB

作業系統:Windows 7; Service Pack 1; 64 位元
R 版本:3.1.0 (2014-04-10) for Windows; Spring Dance
Rtools 版本: Rtools 3.1 for Windows
R-Studio 版本:RStudio 0.98.1028 - Windows XP/Vista/7/8

01.開啟 R-Studio。

02.安裝 Rcpp package 。在「Console」區塊中輸入「install.packages("Rcpp")」

03.建立新專案:點選 File → New Project... 或者點選右上角的 Project 圖示 → New Project...

04.點選 New Directory

05.點選 R Package

06.在「Type:」中點選 Package w/ Rcpp ,並在「Package name」中輸入您的套件名稱。接著按下「Create Project」


07.你將看到 R-Studio 的右下區塊有產生出建立 R package 時,所需要的檔案。若只單純建立 R package 則沒有 src 資料夾(此資料夾是用來存放 C/C++ code )。

08.將 R 資料夾內的 RcppExports.R 與 src 資料夾內的 rcpp_hello_world.cpp 與 RcppExports.cpp 三個檔案開啟,並進行編輯。

在「 RcppExport.R 」檔案中,您可以編輯任何用 R code 寫的函式。當然,您也可以建立新的 .R 檔案進行編輯。在「 R 」資料夾底下的 .R 檔案,皆是以 R code 來執行。

在「 rcpp_hello_world.cpp 」檔案中,您可以編輯任何用 C/C++ code 寫的函式。當然,您也可以建立新的 .cpp 檔案進行編輯。在「 src 」資料夾底下的 .cpp 檔案,皆是以 C/C++ code 來執行。

在「 RcppExports.cpp 」檔案中,主要是將您在 rcpp_hello_world.cpp 檔案中所撰寫的函式與內含的變數做補述。這是因為原始的 C/C++ code 寫起來相當的繁複,而 Rcpp package 已經協助我們將複雜的部分自動做好,使我們在撰寫 C/C++ code 時,不用作太細緻的撰寫。原則上,我們並不需要特別撰寫這個檔案。

(Note: 詳細撰寫 C/C++ code 的部分,在此並不詳述,請具備一些 C/C++ 的基本知識,或從閱讀 Package 'Rcpp'Rcpp: Seamless R and C++ Integration 中學習。)

09.編輯好所有 R code 與 C/C++ code 函式、DESCRIPTION、NAMESPACE及所有.Rd檔案後,點擊功能表列上的「Build」→「Build and Reload」


10.R-Studio 便會執行 Rcmd.exe 檔案,檢查你的 package 是否有錯誤。若執行都正常後,軟體會自動載入建置好的 package ,如此便可立即使用。

11.若想將 package 給別的使用者使用,便要建立 .zip 檔案。請點選「Build」→「Build Binary Package」,系統便會進行一連串的檢查程序。

若都沒有問題,便會將建構好的 .zip 檔案放置在預設的資料夾中。如此便可將此檔案傳遞給所需要的使用者使用。

12.若想上傳到 CRAN 上,則必須建立 .tar.gz 檔案。但由於上傳到 CRAN 上時, package 必須符合 R CRAN team 所制訂的規範(請參考 CRAN Repository Policy 或參考「R CRAN 的 Package 上傳規範」)。所以,在建立 .tar.gz 檔案前,必須先執行套件的檢查。請點選「Build」→「Check Package」


13.R 便會進行一連串的項目檢查,待檢查完畢並確認無任何警告(Warning)或錯誤(Error)訊息後,即檢查完成。下圖右上區塊為檢查後的結果;右下方為檢查後會出現兩個額外的資料夾:「 src-i386 」與「 src-x64 」,分別給32與64位元系統使用;左邊區塊則為執行預設函式的結果。


14.建立 tar.gz 檔案。點擊「Build」→「Build Source Package」

若都沒有問題,便會建立 .tar.gz 檔案。


其檔案放置在預設的資料夾中。


15.前往 R website 中的 web form 進行套件提交,提交流程請參考「R CRAN 的 Package 上傳流程」。在提交前,請確實閱讀 CRAN Repository Policy 或參考「R CRAN 的 Package 上傳規範」。

16.若您有任何想增加 Rcmd.exe 執行時的參數時,請點選「Build」→「Configure Build Tools...」

便可針對需要的項目進行更改。

如果您無法複製上述的任何步驟,或在過程當中出現錯誤,請讓我知道,方便我協助您,感謝!

All works was done in Ivan's Statistics Science Laboratory.

2014年8月28日 星期四

利用 R-Studio 建立 R Package (Build R Package by Using R-Studio)

先前的一篇文章:「如何製作一個專屬於自己的 R package」提及建立 R package 的流程與安裝軟體。但在流程中,所需安裝的軟體與變數的設定太過繁瑣,對一般的使用者來說,會操作的相當辛苦。所幸,在眾人的努力下,許多流程皆已利用程式設定好指令與參數。使用者再也不用一步步去做設定,只需將自己的函式功能撰寫好,剩下的就交給 R-Studio 就好!

環境說明:
處理器:Intel(R) Core(TM)2 Qual CPU Q9550 @ 2.83 GHz 2.83 GHz
記憶體:8.00 GB

作業系統:Windows 7; Service Pack 1; 64 位元
R 版本:3.1.0 (2014-04-10) for Windows; Spring Dance
Rtools 版本: Rtools 3.1 for Windows
R-Studio 版本:RStudio 0.98.1028 - Windows XP/Vista/7/8

01.開啟 R-Studio。

02.建立新專案:點選 File → New Project... 或者點選右上角的 Project 圖示 → New Project...

03.點選 New Directory

04.點選 R Package

05.輸入 package 名稱後,再點選 Create Project

06.你將看到 R-Studio 的右下區塊有產生出建立 R package 時,所需要的檔案。接著,在 R-Studio 中,進入 R 資料夾。

這些檔案將放在您預設的目錄中,且資料夾以套件名稱命名。

07.點擊 MyPackage.R 後,便可在左上區塊編輯你所需要的函式。

08.編輯好函式、DESCRIPTION、NAMESPACE及所有.Rd檔案後,點擊功能表列上的「Build」→「Build and Reload」

09.R-Studio 便會執行 Rcmd.exe 檔案,檢查你的 package 是否有錯誤。若執行都正常後,軟體會自動載入建置好的 package ,如此便可立即使用。

10.若想將 package 給別的使用者使用,便要建立 .zip 檔案。請點選「Build」→「Build Binary Package」,系統便會進行一連串的檢查程序。


若都沒有問題,便會將建構好的 .zip 檔案放置在預設的資料夾中。如此便可將此檔案傳遞給所需要的使用者使用。


11.若想上傳到 CRAN 上,則必須建立 .tar.gz 檔案。但由於上傳到 CRAN 上時, package 必須符合 R CRAN team 所制訂的規範(請參考 CRAN Repository Policy 或參考「R CRAN 的 Package 上傳規範」)。所以,在建立 .tar.gz 檔案前,必須先執行套件的檢查。請點選「Build」→「Check Package」

12.R 便會進行一連串的項目檢查,待檢查完畢並確認無任何警告(Warning)或錯誤(Error)訊息後,即檢查完成。

若在檢查的過程當中,發生 warnings 、 errors 或未知的訊息請參考「R Check Package 常見的 warnings 、 errors 及 未知的訊息」一文。(撰寫中…)

13.建立 tar.gz 檔案。點擊「Build」→「Build Source Package」

若都沒有問題,便會建立 .tar.gz 檔案。


其檔案放置在預設的資料夾中。


14.前往 R website 中的 web form 進行套件提交,提交流程請參考「R CRAN 的 Package 上傳流程」。在提交前,請確實閱讀 CRAN Repository Policy 或參考「R CRAN 的 Package 上傳規範」。


15.若您有任何想增加 Rcmd.exe 執行時的參數時,請點選「Build」→「Configure Build Tools...」

便可針對需要的項目進行更改。

如何,夠簡單吧!=D

如果您無法複製上述的任何步驟,或在過程當中出現錯誤,請讓我知道,方便我協助您,感謝!

All works were done in Ivan's Statistics Science Laboratory.

2014年6月14日 星期六

利用電視卡預約排程錄影功能,錄製你無法觀看的節目!

2014 FIFA WORLD CUP,世界盃足球賽已如火如荼的展開,但迫於不同時區的無奈,每每精彩的LIVE賽事,在地球另一端的人們,總是又到該睡眠的時刻。基於不想爆肝,又在隔日無法觀看重播賽事時,電視卡(TV Card)的「預約排程錄影」功能,就在此扮演了非常關鍵的角色。

不由分說,光看「預約排程錄影」字面上的意思就是可讓您在賽事開始時,電腦可自動開機並打開軟體幫您錄影。在錄影賽事結束後,自動關閉軟體並關閉電腦,等待下一次的排程再開機繼續錄製。讓您有空看或回顧賽事時,便可以隨時隨地點閱觀賞!

以下便介紹筆者所使用的硬體配備與軟體功能,讓各位也能隨錄隨看!

00.配備:
硬體配備:
硬碟(HDD):100Gbyte以上
電視卡:啟視錄, M100 Compro VideoMate X series Video Capture
本著先求有的精神,當初的電視卡是買最便宜的!XDDD

軟體配備:
廠商自建軟體:ComproDTV 4 Build_4.5.7.68.10112301

01.安裝軟、硬體:
步驟一:
裝好電視卡,並插上電視Cable訊號線。

步驟二:
開啟電腦,並安裝ComproDTV 4軟體。持續按下一步至完成,即安裝完成。

02.訊號擷取:
步驟一:
打開軟體之後,會有「精靈」指導訊號的導入,基本上就是一直下一步,直到訊號導入完成。若沒有精靈指導,則可到軟體內的「設定」,在「頻道」分頁下點選「掃瞄」,將訊號導入即可。

步驟二:
可隨時開啟軟體觀看想看的節目。

03.預約排程錄影:
步驟一:
先針對錄影做些基本設定:
請選擇路徑位置:盡量選擇大一點的硬碟空間,通常錄製8小時的節目,在選擇最好的畫素之下,大約需24Gbyte。若您不喜歡單一檔案太大,可選擇自動分割檔案。選擇好之後,請選擇「確定」。


步驟二:
在軟體的面版介面上,選取預約排程。

步驟三:
進入「預約錄影清單」(會稍微等待一些時間),點選「新增」。

步驟四:
進入「預約錄影設定」後,先鍵入「節目名稱:FIFA WORLD CUP」。接著,由於我們想讓電腦自動開機錄影,所以必須選取「啟用自動登入」,否則電腦自動開機後,結果無法登入就好笑了。當然,也要記得在「錄影設定」選取要錄影的「頻道」。以及「日期/時間設定」裡設定「開始時間」與「結束時間」。或者,若您想觀看的節目是週期性的,您也可以設定週期排程錄影。最後,要注意一下「可錄時間」是否足夠。都沒有問題的話,按下「確定」就排程好了。

步驟五:
回到「預約錄影清單」,會發現多一個排程名稱,點選該排程名稱,會出現「預約排程內容」,若有錯誤,可點選「修改」進行設定,待確定無誤後,再點選「確定」即完成預約錄影排程。


步驟六:
接著就可以關機,等待電腦幫您所有的節目排程一一錄製,等待您的觀看。

步驟七:
當您在錄製節目的時候,面版會出現兩個紅點,表示正在錄製。設定的資料夾中,會出現「pvr.tmp」暫存檔。在錄製的過程當中,是無法切換節目的(缺點),但可以擷取畫面。等待節目錄製完成後,便會自動關機。


步驟八:
節目錄製完成後,便會儲存成可觀看的檔案格式,您就可以隨時點選觀看啦!

2014年6月9日 星期一

平行運算的自動化流程錯誤!

一般對大數據(Big Data)在做平行運算的流程概念,不外乎分為三個步驟,分別是:
01.資料分割(Split):針對大數據的量,對可運算的處理器數量或處理器運算能力,做等量分割。
02.分析應用(Apply):針對分割後的資料,在不同的處理器,做相同或不同的運算。
03.膠黏結果(Combine):收集各個處理器計算後的結果,並將這些結果作適當的處理。

這樣的流程,對程式撰寫人員而言,很容易會想將流程自動化的思維。這樣的想法自然是沒有錯,但是很容易將三個步驟合併為一個處理流程,從開始到結束,只留下最終的合併結果,使得在過程中所分割的資料與運算資料的過程,變成了一個「黑箱作業」。假若結果沒有錯誤,那自然沒有問題。不過,一旦發生錯誤,對於整個平行運算的過程,則完全無法追溯。導致除錯困難也不易找到原因。

基於為了避免這樣的情事發生,比較好的方式是將每一步驟都留下相對應的檔案,如此變未來若有任何錯誤發生時,才方便針對錯誤的追查,以節省時間。例如:

黑箱平行運算流程:
01.資料分割:大數據→(分割)→資料一、資料二、資料三、…
02.分析應用:資料一、資料二、資料三、…→(分析應用)→運算結果一、運算結果二、運算結果三、…
03.膠黏結果:運算結果一、運算結果二、運算結果三、…→(膠黏)→最後結果→(儲存)

平行運算流程:
01.資料分割:大數據→(分割)→資料一、資料二、資料三、…→(儲存)
02.分析應用:資料一、資料二、資料三、…→(分析應用)→運算結果一、運算結果二、運算結果三、…→(儲存)
03.膠黏結果:運算結果一、運算結果二、運算結果三、…→(膠黏)→最後結果→(儲存)

如此便可將所有過程與運算結果作相對應的儲存,雖然缺點是比較佔據硬碟空間,但比起運算錯誤後,需要重新運算所流逝的時間相比,失去的硬碟空間便顯得微不足道了。


關鍵字:大數據(Big Data)、平行運算(parallel computing)、平行運算流程(parallel computing flow chart)