R包開發(fā)過程記錄

目的

走一遍R包開發(fā)過程,并發(fā)布到Github上使用。

步驟

1. 創(chuàng)建R包框架

Rsutdio ——> File——> New Project——> New Directory ——> R Package

image.png

創(chuàng)建完成后,在R包文件夾下有如下文件(夾):

  • man: 存放*.Rd文件
  • R: 存放R腳本
  • DESCRIPTION: R包描述信息
  • NAMESPACE: 命令空間
  • rmytools.Rproj: R工程文件
image.png

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文件:

image.png

如果修改了函數(shù)的注釋,需要重新執(zhí)行第二步。

每個函數(shù)都是這樣添加注釋和文檔,比如再添加一個ID轉換的函數(shù):


image.png

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

image.png

添加一些主要的信息即可:

  • Package: 包名
  • Description: 描述信息
  • Depends: 依賴R版本(要注意空格,否則后續(xù)會報錯)
  • Suggest:建議包,非必需
  • Imports:依賴包(這里編寫的函數(shù)依賴了圖中5個R包)
  • License:協(xié)議

③安裝R包
Rstudio ——> Build,可構建源碼包或者二進制包。

image.png

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

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

image.png

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地址)。

image.png

第三,本地倉庫關聯(lián)GitHub,上傳代碼。

git remote add origin git@github.com:***/test.git
git pull origin master #先pull下
git push -u origin master

有個小插曲,我在pull的過程中,遇到了如下錯誤:

image.png

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

上傳成功。


image.png

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對象,自由編輯
image.png

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

Ref:
Kai Gu:如何快速寫一個R包
如何上傳本地代碼到github

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容