目的
走一遍R包開發過程,並發布到Github上使用。
步驟
1. 創建R包框架
Rsutdio ——> File——> New Project——> New Directory ——> R Package

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

2. 自定義R包
上面是Rstudio為開發者創建的一個框架,接下來是對自己開發的R包進行編寫和注解。
①編寫功能函數
點擊Rstudio右下角Files中的R目錄新建R函數(自帶了一個hello.R)。要實現什么樣的功能就編寫相應函數,函數功能的組織和構建也是開發者重要的技能之一。這里作為示例,隨便寫了個畫餅圖的函數(因為現有畫餅圖的函數都不友好)。
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")
}
與一般的函數編寫不同的是,我們需要對這個函數編寫文檔,這就是為什么我們在用R包中函數時可用?來查看函數幫助。
編寫完成后。。。
第一步,給函數添加注釋,這里是對函數整體進行roxygen注釋,方便文檔生成,而非普通代碼注釋。光標放在函數名上,使用Ctrl+Shift+Alt+R快捷鍵即可生成一個基本模板,我們根據需要進行相應修改即可。
#' 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文件夾下生成該函數的Rd文件:

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

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

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

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

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

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

第三,本地倉庫關聯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)
用內置數據集試下:
my_pie(mtcars,2)
my_pie(diamonds,ncol=3)
my_pie(diamonds,ncol=3)+guides(fill="none") #ggplot2對象,自由編輯

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