輕松創建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文件。

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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM