目的
走一遍R包開發(fā)過程,并發(fā)布到Github上使用。
步驟
1. 創(chuàng)建R包框架
Rsutdio ——> File——> New Project——> New Directory ——> R Package

創(chuàng)建完成后,在R包文件夾下有如下文件(夾):
- man: 存放
*.Rd文件 - R: 存放R腳本
- DESCRIPTION: R包描述信息
- NAMESPACE: 命令空間
- rmytools.Rproj: R工程文件

2. 自定義R包
上面是Rstudio為開發(fā)者創(chuàng)建的一個框架,接下來是對自己開發(fā)的R包進行編寫和注解。
①編寫功能函數(shù)
點擊Rstudio右下角Files中的R目錄新建R函數(shù)(自帶了一個hello.R)。要實現(xiàn)什么樣的功能就編寫相應函數(shù),函數(shù)功能的組織和構建也是開發(fā)者重要的技能之一。這里作為示例,隨便寫了個畫餅圖的函數(shù)(因為現(xiàn)有畫餅圖的函數(shù)都不友好)。
my_pie <- function(data,ncol){
plotdat <- as.data.frame(table(data[,ncol])) %>% dplyr::arrange(-Freq)
plotdat$Label <- paste(plotdat$Var1, paste0("(",round(((plotdat$Freq/sum(plotdat$Freq))*100),2),"%)"))
p <- ggplot(plotdat, aes (x="", y = Freq, fill = factor(Var1))) +
geom_col(position = 'stack', width = 1) +
geom_text_repel(aes(label = Label, x = 1.3),size=5,
position = position_stack(vjust = 0.5)) +
theme_classic() +
theme(plot.title = element_text(hjust=0.5),
axis.line = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank()) +
labs(fill = "Category",x = NULL,y = NULL) +
coord_polar("y")
}
與一般的函數(shù)編寫不同的是,我們需要對這個函數(shù)編寫文檔,這就是為什么我們在用R包中函數(shù)時可用?來查看函數(shù)幫助。
編寫完成后。。。
第一步,給函數(shù)添加注釋,這里是對函數(shù)整體進行roxygen注釋,方便文檔生成,而非普通代碼注釋。光標放在函數(shù)名上,使用Ctrl+Shift+Alt+R快捷鍵即可生成一個基本模板,我們根據(jù)需要進行相應修改即可。
#' Using a dataframe specific column to plot a pie figure
#'
#' @param data a dataframe or tibble
#' @param ncol specific column, factor
#'
#' @return a figure as ggplot2 object
#' @export
#'
#' @examples
#' my_pie(mtcars,ncol=2)
#' my_pie(diamonds,ncol=3)
#' my_pie(diamonds,ncol=3)+guides(fill="none")
#'
my_pie <- function(data,ncol){
plotdat <- as.data.frame(table(data[,ncol])) %>% dplyr::arrange(-Freq)
plotdat$Label <- paste(plotdat$Var1, paste0("(",round(((plotdat$Freq/sum(plotdat$Freq))*100),2),"%)"))
p <- ggplot(plotdat, aes (x="", y = Freq, fill = factor(Var1))) +
geom_col(position = 'stack', width = 1) +
geom_text_repel(aes(label = Label, x = 1.3),size=5,
position = position_stack(vjust = 0.5)) +
theme_classic() +
theme(plot.title = element_text(hjust=0.5),
axis.line = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank()) +
labs(fill = "Category",x = NULL,y = NULL) +
coord_polar("y")
}
第二步,運行devtools::document(),會在man文件夾下生成該函數(shù)的Rd文件:

如果修改了函數(shù)的注釋,需要重新執(zhí)行第二步。
每個函數(shù)都是這樣添加注釋和文檔,比如再添加一個ID轉換的函數(shù):

②修改DESCRIPTION
點擊右下角Files中的DESCRIPTION對模塊進行修改。

添加一些主要的信息即可:
- Package: 包名
- Description: 描述信息
- Depends: 依賴R版本(要注意空格,否則后續(xù)會報錯)
- Suggest:建議包,非必需
- Imports:依賴包(這里編寫的函數(shù)依賴了圖中5個R包)
- License:協(xié)議
③安裝R包
Rstudio ——> Build,可構建源碼包或者二進制包。

點擊后會進行編譯以及更新文檔。

使用?my_pie等編寫的函數(shù),已經(jīng)可以查看文檔了,說明編譯成功,已經(jīng)可以使用R包了。

3. 上傳Github
如果只是自己使用,可以放在本地。本著R語言開源精神,要想分享給其他人使用,需要有地方托管。權威認可的地方如CRAN、Bioconductor等,但如果專業(yè)度不夠高或者處于開發(fā)階段,還是托管在Github上吧。
從本地倉庫上傳到Github遠程倉庫,與一般代碼上傳無異。
首先,進入本地R包目錄。
git init
git add .
git commit -m 'my first r package'
然后,登錄Github新建Repository(建議用SSH地址,盡量不要用HTTPS地址)。

第三,本地倉庫關聯(lián)GitHub,上傳代碼。
git remote add origin git@github.com:***/test.git
git pull origin master #先pull下
git push -u origin master
有個小插曲,我在pull的過程中,遇到了如下錯誤:

原因是SSH keys沒有設置或者過期了,SSH keys 可以在沒有密碼的情況下信任當前工作的計算機。解決辦法是生成并設置SSH keys。具體可參考這篇教程:解決github Permission denied (publickey)問題。
上傳成功。

4. 安裝使用
devtools工具為我們提供了Github的R包安裝方式:
devtools::install_github("**/my_rpackage/rmytools")
library(rmytools)
用內(nèi)置數(shù)據(jù)集試下:
my_pie(mtcars,2)
my_pie(diamonds,ncol=3)
my_pie(diamonds,ncol=3)+guides(fill="none") #ggplot2對象,自由編輯

用R包來管理組織自己平時經(jīng)常用的代碼是一種非常高效的方式,后續(xù)想添加任何功能或修改原有腳本,只需git push,重新裝一下R包即可。是時候整理整理之前混亂的代碼了(俗稱屎山)。