輕鬆建立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)

  

好了,準備工做就緒,打開一個新的腳本,便可以開始寫包之旅。

檢測環境

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文件夾內添加本身編寫的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文件夾內,保存。

編輯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: 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)
相關文章
相關標籤/搜索