輕松創建R包
講真,用R這么幾年,始終未嘗試過寫自己的包,看來這就是我與真正程序員的差距了——編程習慣等于沒有。
昨天一個偶然的機會想開始寫自己的工具包,發現了前期教程的有一些過時。于是,寫一個**windows**下新的簡易版參考,以備不時之需。內容基本來源為男神Hadley Wickham的Advanced R programming一書。 PS:通過以下教程寫出來的包還不能放到CRAN上,僅方便自己的代碼移植;如果你想讓自己的function在CRAN揚名立萬,還需要做很多其他的工作。
那些年需要做的準備工作
首先,安裝Rtools: http://cran.r-project.org/bin/windows/Rtools/,想必你已經知道了這并不是一個R的包;
其次,最好有一個Rstudio;
再次,愉快的安裝devtools包吧:
install.packages("devtools",dependencies=T)
好了,準備工作就緒,打開一個新的腳本,即可以開始寫包之旅。
</div>
檢測環境
library(devtools) has_devel()#診斷環境
利用has_devel函數檢測當前的環境是否有問題,比如gcc,可能因為我也忘記了自己之前之前配置過什么,反正總之就是沒問題哈哈,是的只要返回值是TRUE就沒問題。
</div>
早就說了要開始現在才開始
create("H:/WorkingSpace/RWorkingSpace/BigFaceTools")#創建包的文件夾,文件夾名就是包的名字,比如我的就是大臉工具,囧…… setwd("H:/WorkingSpace/RWorkingSpace/BigFaceTools")#工作空間轉移,這樣比較方便
值得一提的是,除了以上命令外,也可以通過Rstudio中的file-New Project-New Directory-R Package來新建R包的項目。
來看看這個項目的結構:
1.一個R的文件夾,用來存放.r腳本,比如你的常用function,放在這里即可;
2.一個基礎的無后綴的DESCRIPTION文本文件,可以用任意文本編輯器打開,是對于你將創建的R包的基礎介紹;
3.NAMESPACE文件,可以先不用管它;
總之,一個package的框架基本就有了,剩下的就是往里面填東西。
</div>
添加.r文件
首先往包文件目錄下的R文件夾內添加自己編寫的R腳本,如果此時你沒有合適的腳本那么隨便寫個function也是可以的:
print_intro=function(){ print("Laoliu is the most handsome man in this package! LOL...") }
無盡的心酸……
實際上,我自己寫了很多小函數,放一個進去吧:
#' read all worksheet in one excel file to return a data.frame by using readxl' @param file,should be a file address str
' @param sheet_name,if the sheetname be one column of the result
' @export
read_all_xlsx_sheets=function(file,sheet_name=TRUE){ for(pkg in c("plyr","dplyr","magrittr","readxl")){ if(!requireNamespace(pkg,quietly=TRUE)){ stop(paste("The ",pkg," package needed for this function to work. Please install it.",sep=""), call. = FALSE) } } library(plyr,warn.conflicts=F) library(dplyr,warn.conflicts=F) library(readxl,warn.conflicts=F)
tables=readxl::excel_sheets(file) if(sheet_name){ res=plyr::ldply(tables,function(x)dplyr::mutate(readxl::read_excel(file,sheet=x),sheet_name=x)) }else{ res=plyr::ldply(tables,function(x)readxl::read_excel(file,sheet=x)) } return(res) }</pre>
對各個參數注釋后,把代碼的.r文件放入BigFaceTools/R文件夾內,保存。
</div>編輯DESCRIPTION
file.edit("DESCRIPTION")#編寫描述文件打開時的樣子:
Package: BigFaceTools Title: What the Package Does (one line, title case) Version: 0.0.0.9000 Authors@R: person("First", "Last", email = "first.last@example.com", role = c("aut", "cre")) Description: What the package does (one paragraph). Depends: R (>= 3.2.3) License: What license is it under? LazyData: true根據我的需要,把它編輯成了這樣:
Package: BigFaceTools Title: BigFace's data processing functions Version: 0.0.0 Authors@R: person("Lao","Liu",email="LaoLiu@gmail.com",role=c("aut","cre")) Description: BigFace's personalized data processing functions Depends: R (>= 3.2.3) Imports:plyr,dplyr,magrittr,RODBC License: everyone LazyData: trueAuthors@R的格式必須要用person函數來寫,其他的因為無上傳打算,隨意就好。
關于以上,因為在.r文件中引用了三個包,故把這三個包寫入imports中,在后期加載時BigFaceTools自動加載這三個包。
use_package("plyr") use_package("dplyr") use_package("readxl")</div>準備打包
load_all()每一次運行load_all(),都會載入BigFaceTools/R內最新的所有.r文件內容。
read_all_xlsx_sheets("iris_test.xlsx")#測試如果沒什么意外(其實會有,可以發現我載入了幾個新的包,plyr、dplyr、magrittr,如果想用以上代碼測試,建議安裝),測試當然會通過。
document() 接著用document()將BigFaceTools/R內的所有.r文件生成為BigFaceTools/man文件夾內的.Rd文件。
build()#打包打包成一個壓縮文件,生成BigFaceTools_0.0.0.tar.gz,用于安裝,這個文件會生成在BigFaceTools文件夾的上一級欄目。
使用</pre><pre>install(".")</pre><pre class="brush:java; toolbar: true; auto-links: false;"><span style="font-family:'Microsoft YaHei';font-size:16px;"> 安裝,大功告成。 重啟Rstudio,調用一下吧^0^</pre><pre class="brush:java; toolbar: true; auto-links: false;">library(BigFaceTools)
test_file=system.file("iris_test.xlsx",package="BigFaceTools")#測試文件 read_all_excel_sheets(test_file)</pre>
以下為全部代碼奉上:
library(devtools) has_devel() create("H:/WorkingSpace/RWorkingSpace/BigFaceTools") setwd("H:/WorkingSpace/RWorkingSpace/BigFaceTools") file.edit("./R/BigFaceTools_1.r")#.r文件 file.edit('DESCRIPTION')#編寫描述文件 use_package("plyr") use_package("dplyr") use_package("readxl")load_all()#載入R文件夾中的所有.r文件 read_all_xlsx_sheets("../iris_test.xlsx")#測試 document()#在man文件夾中生成對應的.Rd 文件
check()#看看有沒有錯誤 build()#打包
install(pkg=".")#安裝
重啟后再進來試試
library(BigFaceTools) test_file="iris_test.xlsx"#測試文件 read_all_xlsx_sheets(test_file)</pre></div> </div>
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!相關經驗
相關資訊