在「
利用 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.