R包開發過程記錄


目的

走一遍R包開發過程,並發布到Github上使用。

步驟

1. 創建R包框架

Rsutdio ——> File——> New Project——> New Directory ——> R Package
image.png
創建完成后,在R包文件夾下有如下文件(夾):

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

image.png

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文件:
image.png

如果修改了函數的注釋,需要重新執行第二步。

每個函數都是這樣添加注釋和文檔,比如再添加一個ID轉換的函數:
image.png

②修改DESCRIPTION
點擊右下角Files中的DESCRIPTION對模塊進行修改。
image.png
添加一些主要的信息即可:

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

③安裝R包
Rstudio ——> Build,可構建源碼包或者二進制包。
image.png
點擊后會進行編譯以及更新文檔。
image.png

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

3. 上傳Github

如果只是自己使用,可以放在本地。本着R語言開源精神,要想分享給其他人使用,需要有地方托管。權威認可的地方如CRAN、Bioconductor等,但如果專業度不夠高或者處於開發階段,還是托管在Github上吧。

從本地倉庫上傳到Github遠程倉庫,與一般代碼上傳無異。

首先,進入本地R包目錄。

git init
git add .
git commit -m 'my first r package'

然后,登錄Github新建Repository(建議用SSH地址,盡量不要用HTTPS地址)。
image.png

第三,本地倉庫關聯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)

用內置數據集試下:

my_pie(mtcars,2)
my_pie(diamonds,ncol=3)
my_pie(diamonds,ncol=3)+guides(fill="none")  #ggplot2對象,自由編輯

image.png

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

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


免責聲明!

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



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