R-編寫R包-入門篇

總結(jié)一下目前學(xué)習(xí)的专控,基于Rstudio的創(chuàng)建R包流程锦担。

Part1:創(chuàng)建R包基本流程

step1:建立R包開發(fā)環(huán)境

  • 目的是創(chuàng)建一個文件夾镀岛,用于儲存編寫R包的各種文檔翔烁;在創(chuàng)建之前想 好R包的名字渺氧,以及文件夾的路徑。
  • 這里示例R包名為newPackage蹬屹。
  • 進入Rstudio界面侣背,依次點擊File → New project → New Directory → R package,會出現(xiàn)如下界面,填寫好R包名字慨默,選擇好開發(fā)包的工作目錄(其它暫時都不用考慮)贩耐;最后點擊Creat Project即可。
  • 如上操作后业筏,會進入新的工作環(huán)境憔杨,即R包開發(fā)環(huán)境;同時已經(jīng)創(chuàng)建好R包開發(fā)所需的所必須的模板文檔蒜胖。主要包括4個部分:


(1)R 文件夾:用于存放R函數(shù)腳本的文件夾消别;里面有一個示例文件hello.R
(2)man 文件夾:用于存放對應(yīng)上述R函數(shù)的說明文檔Rd文件的文件夾;里面有一個示例文件hello.Rd台谢。
(3)DESCRIPTION:關(guān)于R包的說明文檔寻狂。
(4)NAMESPACE:聲明R包導(dǎo)出以供外部使用的函數(shù)以及R包從其他包導(dǎo)入的外部函數(shù)。

其中只有R函數(shù)腳本與DESCRIPTION需要我們細心準備外朋沮,其它可通過一些辦法自動寫入蛇券、更新。

step2:編寫函數(shù)

2.1 首先先刪除R文件夾里的示例文件樊拓、整個man文件夾纠亚、NAMESPACE文件;
2.2 然后在R文件夾內(nèi)創(chuàng)建后綴名為.R的函數(shù)腳本筋夏,編寫自定義的函數(shù)蒂胞;
  • (1)如下在新創(chuàng)建的add.R腳本中,編寫一個簡單的加法函數(shù)条篷。

  • (2) 然后鼠標放置在函數(shù)上(如上圖)骗随,按Ctrl+Alt+Shift+R組合快捷鍵為函數(shù)添加說明文檔模板(Insert Roxygen Skeleton)(下左)蛤织;根據(jù)自己函數(shù)的功能完成注釋(下右)

  • (3)測試編寫的函數(shù),有沒有問題

#激活R文件夾內(nèi)的所有函數(shù)鸿染,供測試使用
devtools::load_all()
# i Loading newPackage
add(1,6)
# [1] 7

重復(fù)上述1~3步驟指蚜,不斷添加新的函數(shù)≌墙罚可以是一個函數(shù)對應(yīng)一個腳本摊鸡,也可以將同一類的函數(shù)都放置在一個腳本內(nèi)。

  • (4)為所有函數(shù)在man文件夾(如果沒有蚕冬,會創(chuàng)建)下逐一自動建立Rd文檔柱宦,以及更新NAMESPCAE文檔
# 重復(fù)上述1~3步驟,又創(chuàng)建了一個減法的函數(shù)腳本

devtools::document()
# i Updating newPackage documentation
# i Loading newPackage
# Writing NAMESPACE
# Writing NAMESPACE

step3:編寫DESCRIPTION文件

  • 函數(shù)寫好了之后播瞳,就需要對這個包的總體功能等信息進行描述與說明,這些信息主要包含在DESCRIPTION文件中
3.1 先如下圖所示免糕,修改其中的四點說明:Title包的名字赢乓,Authors@RMaintainer作者以及維護者信息石窑、Description包的簡要描述
3.2 然后使用下述函數(shù)牌芋,自動編寫License部分
# 如果沒有依賴到別的具有不同版權(quán)的第三方包的話,一般選擇最為廣泛使用的 MIT 即可
usethis::use_mit_license()

此外松逊,如果版本有更新躺屁,可手動修改 Version部分

3.3 之后再補充依賴包的信息。分為兩類:Imports经宏、Suggests犀暑、Depends

  • 三者的區(qū)別還沒完全清楚烁兰,暫時覺得還是第一個常用耐亏。
  • 可使用函數(shù)usethis::use_package(package, type = "Imports", min_version = NULL);
  • 假設(shè)其中的一個自定義的函數(shù)必須要用到dplyr包的filter()函數(shù)(因為實際中并未沒有使用,之后會刪去)
usethis::use_package("dplyr", type = "Imports",
                     min_version = "1.0")
# √ Adding 'dplyr' to Imports field in DESCRIPTION
# * Refer to functions with `dplyr::fun()`

# 在函數(shù)腳本中使用的過程調(diào)用其它包的函數(shù)時沪斟,必須按照`package::function`广辰,如`dplyr::filter()`的形式調(diào)用。

如上主之,DESCRIPTION最基本的信息就填寫好了择吊。

3.4 最后再check一下上述的所有文件,包括函數(shù)腳本槽奕,看看有沒有問題

  • 在R包不斷完善的過程中几睛,可以隨時check一下,保證之前的修改沒有什么問題
devtools::check()
# -- R CMD check results --------------------- newPackage 0.1.0 ----
#   Duration: 19s
# 
# 0 errors √ | 0 warnings √ | 0 notes √

step4:收尾工作--安裝包

  • (1)將包安裝到本地的電腦
    點擊Build → Install and restart史翘,可將進行安裝R枉长,重啟R冀续,加載該包三個步驟。
  • (2)將包制成壓縮包(*.tar.gz)必峰,方便傳輸或者分享
    點擊Build → Build Source Package
install.packages("path/to/newPackage_0.1.0.tar.gz", 
                 repos=NULL, type="source")

Part2:R包進階操作

上面介紹了編寫R包的最簡單的流程洪唐,還有很多進階知識點值得學(xué)習(xí)。下面總結(jié)其中三個方面的整理吼蚁。

2.1 添加示例數(shù)據(jù)集

(1)存儲為rdata格式并使其對用戶可用
  • 使用usethis::use_data()函數(shù)凭需,將數(shù)據(jù)對象(字符串、表格)儲存到data文件夾里的rdata文件肝匆。
x <- sample(1000)
usethis::use_data(x)
# √ Saving 'x' to 'data/x.rda'
# * Document your data (see 'https://r-pkgs.org/data.html'

dataframe = mtcars
usethis::use_data(dataframe)
# √ Saving 'dataframe' to 'data/dataframe.rda'
# * Document your data (see 'https://r-pkgs.org/data.html')
  • 根據(jù)提示粒蜈,需要在R文件夾下,創(chuàng)建內(nèi)容框架如下的data.R說明文件
#' x
#'
#' Just test number(Description)
#'
#' @examples
#'   head(x)
"x"

#' dataframe
#'
#' Just test dataframe(Description)
#'
#' @examples
#'   head(dataframe)
"dataframe"
(2)儲存為原始文件的形式(例如.csv旗国,.xlsx等)
  • 創(chuàng)建inst/extdata文件夾枯怖,用于儲存這些文件即可
dir.create("inst/extdata", recursive = T)
write.csv(mtcars, file = "inst/extdata/example.csv")
(3)調(diào)用這些數(shù)據(jù)
  • document()check()一下能曾;重新安裝度硝,加載
devtools::document()
devtools::check()

點擊Build → Install and restart

  • 調(diào)用示例數(shù)據(jù)
data(x)
?x
str(x)
# int [1:1000] 134 448 373 532 823 646 567 146 776 503 ...

data(dataframe)
dim(dataframe)
# [1] 32 11

system.file("extdata", "example.csv", 
            package = "newPackage")
# [1] "C:/Users/******/Documents/R/win-library/4.1/newPackage/extdata/example.csv"

2.2 代碼整理

(1)代碼美化
# 安裝 {styler}
# install.packages("styler")

# 對整個包進行代碼美化
styler::style_pkg()
(2)代碼規(guī)范性檢查
# 安裝 {lintr}
# install.packages("lintr")

# 對整個包進行不符合規(guī)范的代碼查詢(當然,都沒有寫多少代碼寿冕,當然不會出現(xiàn)什么錯誤結(jié)果)
lintr::lint_package()

2.3 上傳github以及后續(xù)相關(guān)操作(☆)

在我理解蕊程,將個人創(chuàng)建的R包上傳到github中,可以高效的實現(xiàn)版本的控制驼唱、備份以及與他人共享藻茂,自己的使用等

(1)上傳至github
  • 已經(jīng)基本完成了R包的成形工作(Part1),或者剛建立好R包開發(fā)環(huán)境也可以玫恳。
  • 下載安裝 Github Desktop辨赐,并登陸自己的個人賬戶。
  • 如下圖京办,將R包開發(fā)環(huán)境目錄關(guān)聯(lián)到respository倉庫內(nèi)肖油。


點擊之后,一般會提示關(guān)聯(lián)的R包開發(fā)環(huán)境目錄不在Git的倉庫列表中臂港,點擊creat a repository即可

最后再點擊Publish respository森枪,并設(shè)置是否code private即可成功上傳到github。

(2)commit → push
  • 之后對包的文檔進行修改审孽、更新等操作時县袱,都可以通過Github Desktop進行方便的提交
  • 如下,對包添加了一個函數(shù):在Github Desktop左下角填寫更改的描述佑力、點擊Commit to main式散,再push到github上。之后在github主頁看到的就是更新后的版本打颤。


(3)創(chuàng)建README文件
# 引入必備包 {rmarkdown}
# install.packages("rmarkdown")

# 默認的 README.Rmd 模版就創(chuàng)建完
usethis::use_readme_rmd()

# 然后在README.Rmd文件中進行修改
# 最后Knit即可

# 最后再在Github Desktop里 commit→push即可再github頁面創(chuàng)建美觀的read.me文檔
https://github.com/lishensuo

參考教程:
1暴拄、為新手準備的現(xiàn)代化 R 包開發(fā)流程 https://cosx.org/2021/02/writing-r-packages-a-modern-workflow-for-beginners/
2漓滔、R包的開發(fā) https://zhuanlan.zhihu.com/p/336425664
3、https://r-packages-zh-cn.readthedocs.io/zh_CN/latest/index.html


補充

  • (1) 在代碼腳本中引入管道符 %>%
usethis::use_pipe() #在R中使用管道符
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末乖篷,一起剝皮案震驚了整個濱河市响驴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撕蔼,老刑警劉巖豁鲤,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鲸沮,居然都是意外死亡琳骡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門讼溺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來楣号,“玉大人,你說我怎么就攤上這事怒坯∈” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵敬肚,是天一觀的道長。 經(jīng)常有香客問我束析,道長艳馒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任员寇,我火速辦了婚禮弄慰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蝶锋。我一直安慰自己陆爽,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布扳缕。 她就那樣靜靜地躺著慌闭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪躯舔。 梳的紋絲不亂的頭發(fā)上驴剔,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音粥庄,去河邊找鬼丧失。 笑死,一個胖子當著我的面吹牛惜互,可吹牛的內(nèi)容都是我干的布讹。 我是一名探鬼主播琳拭,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼描验!你這毒婦竟也來了白嘁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤挠乳,失蹤者是張志新(化名)和其女友劉穎权薯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體睡扬,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡盟蚣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了卖怜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屎开。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖马靠,靈堂內(nèi)的尸體忽然破棺而出奄抽,到底是詐尸還是另有隱情,我是刑警寧澤甩鳄,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布逞度,位于F島的核電站,受9級特大地震影響妙啃,放射性物質(zhì)發(fā)生泄漏魁巩。R本人自食惡果不足惜暂吉,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一火架、第九天 我趴在偏房一處隱蔽的房頂上張望竭钝。 院中可真熱鬧,春花似錦燥滑、人聲如沸渐北。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赃蛛。三九已至,卻和暖如春搀菩,著一層夾襖步出監(jiān)牢的瞬間焊虏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工秕磷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诵闭,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像疏尿,于是被迫代替她去往敵國和親瘟芝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容