转载自参考 https://mp.weixin.qq.com/s/Q_chMLju5YEIFncWJ2GFlw
准备:
R,Rstudio,github桌面版,github账户
基本要求
会使用上面的软件,理解本地版github同步到远端的过程
开始写包
-
包的基本结构
-
编写函数
-
生成文档骨架
-
用 {renv} 进行依赖(加载包)的版本控制
install.packages("renv")
初始化环境
renv::init()
自动打包项目中的依赖包的信息,包括名称和版本信息
renv::update()
对依赖包进行更新(更新依赖包的版本)
更新到当前所用的包环境(每次编写新的函数或脚本后,如果有依赖新的包,则需要运行这条命令,更新自己的依赖环境信息)
renv::snapshot()
(更新的是自己编写的包里对依赖包的依赖信息)
如果换了电脑开发,renv::restore()
恢复到开发时用的包环境
包为必需的时候用imports
; 非必须的时候用Suggests
usethis::use_package(package = "ggplot2", type = "imports")
usethis::use_package(package = "renv", type = "Suggests")
- 编写READEME 会自动生成一个readme.Rmd文件,
# 引入必备包 {rmarkdown}
install.packages("rmarkdown")
# 虽然也可以使用 usethis::use_readme_md()
usethis::use_readme_rmd()
然后使用knit转换为github的md文件即可或者
运行命令也可 rmarkdown::render('README.Rmd',"github_document")
- 代码格式优化
使用
{styler}
来美化代码
# 安装 {styler}
install.packages("styler")
# 对整个包进行代码美化
styler::style_pkg()
- 用 {lintr} 来规范代码
# 安装 {lintr}
install.packages("lintr")
# 对整个包进行不符合规范的代码查询(当然,都没有写多少代码,当然不会出现什么错误结果)
lintr::lint_package()
# 比如我们在 add 函数中增加一个超过80字符的注释
add <- function(a, b) {
# aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
a + b
}
# 再次执行
lintr::lint_package()
- 用 {testthat} 来测试代码 在编写一个具有可靠性的包的时候,特别是当函数变得复杂的时候,测试是必不可少的。 我们可以用 {usethis} 来快速设定编写测试所需要的 {testthat} 的环境。
# 设定环境
usethis::use_testthat()
安装 {testthat}
install.packages("testthat")
快速创建测试文件
usethis::use_test()
10. 编写包的说明
在别的教程中,一般都会把包的说明放到前面,说明这也是很重要的一步。 在这里,为了把说明部分都汇总到一起,就将其放到了偏后的部分。
打开根目录下的 DESCRIPTION 文件,对包说明进行一些修改,主要是 Title、Authors 和 Description 部分,别的都可以原封不动:
Package: rPackageTutorial
Title: Create R Package In A Professional Way Tutorial
Version: 0.0.0.9000
Authors@R:
person(given = "Wei",
family = "Su",
role = c("aut", "cre"),
email = "swsoyee@gmail.com")
Description: Show an example of how to create a r package in a professional way.
License: `use_mit_license()`, `use_gpl3_license()` or friends to
pick a license
Encoding: UTF-8
LazyData: true
Roxygen: list(markdown = TRUE)
RoxygenNote: 7.1.1
Suggests:
testthat (>= 3.0.0)
Config/testthat/edition: 3
如果没有依赖到别的具有不同版权的第三方包的话,一般选择最为广泛使用的 MIT 即可
usethis::use_mit_license()
升级版本号
usethis::use_version()
轻量版检查
devtools::check()
11. 用 Github Action 自动检查
如无特殊需求,或者新手入门下述命令直接无脑设置即可
usethis::use_tidy_github_actions()
devtools::build_rmd()
- 增加 NEWS 页面,用于记录每一次升级所做出的变更
usethis::use_news_md()
to be continued