輕松創建R包

jopen 8年前發布 | 19K 次閱讀 RStudio Windows

講真,用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: true
Authors@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()

&nbsp; &nbsp; 接著用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>

來自: http://www.cnblogs.com/big-face/p/5116954.html

</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!