如何用devtools快速开发一个R语言包?

资源在这https://r-pkgs.org/,标记自取。
以下内容中黄色字体是关键流程和注意要点。
1. 准备工作
library(devtools) 可以从任何活动的R会话初始化新包。你不需要担心你是否在一个现有的或新的项目中。
> library(devtools)
载入需要的程辑包:usethis
Warning messages:
1: 程辑包‘devtools’是用R版本4.2.3 来建造的
2: 程辑包‘usethis’是用R版本4.2.3 来建造的
为了避免版本不同而导致和本教程有所出入,请检查版本:
> packageVersion("devtools")
[1] ‘2.4.5’
2. 如何完整开发一个R包
为了完成开发包的整个过程,我们将使用devtools中的各种功能从头开始构建一个小的玩具包,其中包含了已发布包中常见的功能:
- 用于满足特定需求的函数,在本例中是用于处理正则表达式。
- 版本控制和开放的开发过程。
- 这在您的工作中是完全可选的,但强烈推荐。您将看到Git和GitHub如何帮助我们公开玩具包的所有中间阶段。
- 访问已建立的工作流程,以进行安装、获取帮助和检查质量。
- 单个功能的文档通过roxygen2。
- 使用testthat进行单元测试。
- 通过可执行文件README.Rmd获得整个包的文档。
我们这里创建的包并没有多大用处,只是用来演示使用devtools进行包开发的典型工作流。
3. 初始化新包
调用 create_package() 初始化计算机上目录中的新包。如果该目录还不存在(通常是这种情况),Create_package()将自动创建该目录。
- 慎重选择在计算机上的什么位置创建这个包。
- 它应该在您的主目录中,与其他R项目放在一起。
- 它不应该嵌套在另一个RStudio项目、R包或Git仓库中。
- 它也不应该在R包库中,其中包含已经构建和安装的包。
- 将我们在这里创建的源包转换为已安装的包是devtools的一部分。不要试图做devtools的工作!
一旦你选择了在哪里创建这个包,将你选择的路径替换为create_package()调用,如下所示:
> create_package("~/regexcite")
✔ Creating 'C:/Users/bailo/regexcite/'
✔ Setting active project to 'C:/Users/bailo/regexcite'
✔ Creating 'R/'
✔ Writing 'DESCRIPTION'
Package: regexcite
Title: What the Package Does (One Line, Title Case)
Version: 0.0.0.9000
Authors@R (parsed):
* First Last <first.last@example.com> [aut, cre] (YOUR-ORCID-ID)
Description: What the package does (one paragraph).
License: `use_mit_license()`, `use_gpl3_license()` or friends to
pick a license
Encoding: UTF-8
Roxygen: list(markdown = TRUE)
RoxygenNote: 7.2.3
✔ Writing 'NAMESPACE'
✔ Writing 'regexcite.Rproj'
✔ Adding '^regexcite\\.Rproj$' to '.Rbuildignore'
✔ Adding '.Rproj.user' to '.gitignore'
✔ Adding '^\\.Rproj\\.user$' to '.Rbuildignore'
✔ Opening 'C:/Users/bailo/regexcite/' in new RStudio session
✔ Setting active project to '<no active project>'
如果你在RStudio中工作,你会发现自己在一个新的RStudio实例中,打开你的新regexcite包(和Project)。如果您需要手动执行此操作,请导航到该目录并双击regexcite.Rproj。
您可能需要再次调用库(devtools),因为create_package()可能已经将您放入新包中的新R会话中。
比如,运行create_package(“~/regexcite”)的RStudio中:

运行接受,除了在控制台显示结果外,还自动打开了新包的RStudio窗口:

故此,在新包的RStudio窗口中,需要重新调用库(devtools)。
> library(devtools)
载入需要的程辑包:usethis
Warning messages:
1: 程辑包‘devtools’是用R版本4.2.3 来建造的
2: 程辑包‘usethis’是用R版本4.2.3 来建造的
新包目录里的内容如下:

- .Rbuildignore列出了我们需要但在从源代码构建R包时不应该包含的文件。如果你没有使用RStudio, create_package()一开始可能不会创建这个文件(也不会创建.gitignore),因为没有RStudio相关的机制需要被忽略。然而,无论您使用的是什么编辑器,您都可能在某些时候开发出对. rbuildignore的需求。
- .Rproj.user(如果有的话)是RStudio内部使用的目录(我这里就没有)。
- .gitignore预测了Git的使用,并告诉Git忽略一些由R和RStudio创建的标准的幕后文件。即使您不打算使用Git,这也是无害的。
- DESCRIPTION提供有关包的元数据。
- NAMESPACE声明包导出供外部使用的函数,以及包从其他包导入的外部函数。在这一点上,它是空的,除了一个注释声明这是一个您不应该手工编辑的文件。
- R/目录是包的“业务端”。它将很快包含带有函数定义的. r文件。
- regexcite.Rproj是使该目录成为RStudio项目的文件。即使你不使用RStudio,这个文件也是无害的。或者你可以用create_package(…), rstudio = FALSE)。
4. 启用Git仓库
regexcite目录是一个R源码包和一个RStudio项目。现在我们使用 use_git() 将它变成一个Git存储库。
在交互式会话中,系统将询问您是否要在这里提交一些文件,以及您是否应该接受该提议。

再次接受立即重启RStudio。
那么一步对包有什么变化呢?只需要创建一个git目录,它在大多数上下文中是隐藏的,包括RStudio文件浏览器。它的存在证明我们确实在这里初始化了一个Git仓库。
上面可以看到RStudio里是看不到git目录的,而在电脑的文件浏览器中可以看到。

5. 按照目标实现一个函数
这里是开发R包的核心,但不管多复杂也只是开发流程的一步。这里用简单的一个函数示例。
strsplit1 <- function(x, split) {
strsplit(x, split = split)[[1]]
}
6. 在.R文件夹下创建文件并保存代码
应该把strsplit1()的定义放在哪里?将它保存在包的R/子目录下的.R文件中。合理的起始位置是为包中每个面向用户的函数创建一个新的. r文件,并以该函数命名该文件。当您添加更多函数时,您将希望放松这一点,并开始将相关函数分组在一起。我们将strsplit1()的定义保存在文件R/strsplit1.R中。
帮助器 use_r() 在R/下创建和/或打开一个脚本。

将上面的strsplit1()函数写入strsplit1文件中并保存。


1万+

被折叠的 条评论
为什么被折叠?



