講真,用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)
好了,準備工做就緒,打開一個新的腳本,便可以開始寫包之旅。
library(devtools) has_devel()#診斷環境
利用has_devel函數檢測當前的環境是否有問題,好比gcc,可能由於我也忘記了本身以前以前配置過什麼,反正總之就是沒問題哈哈,是的只要返回值是TRUE就沒問題。
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的框架基本就有了,剩下的就是往裏面填東西。
首先往包文件目錄下的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) }
對各個參數註釋後,把代碼的.r文件放入BigFaceTools/R文件夾內,保存。
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: true
Authors@R的格式必需要用person函數來寫,其餘的由於無上傳打算,隨意就好。
關於以上,由於在.r文件中引用了三個包,故把這三個包寫入imports中,在後期加載時BigFaceTools自動加載這三個包。
use_package("plyr") use_package("dplyr") use_package("readxl")
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文件。
windows
build()#打包
打包成一個壓縮文件,生成BigFaceTools_0.0.0.tar.gz,用於安裝,這個文件會生成在BigFaceTools文件夾的上一級欄目。 使用
install(".")
安裝,大功告成。 重啓Rstudio,調用一下吧^0^
library(BigFaceTools) test_file=system.file("iris_test.xlsx",package="BigFaceTools")#測試文件 read_all_excel_sheets(test_file)
如下爲所有代碼奉上:
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)