使用脚本文件中的代码创建 R 包

Creating R package using code from script file

我已经使用 RStudio 编写了一些 R 函数并将它们放入脚本文件中。这些是我反复使用的一些代码,所以我想知道如何最轻松地从中创建一个 R 包(供我自己私人使用)。

我在网上阅读了各种“操作方法”指南,但它们非常复杂。谁能推荐一个“白痴指南”来做这件事?

我最近参与了 R 包的创建,所以我可以帮助你。在继续要执行的步骤之前,有一些 pre-requisites,其中包括:

  • RStudio
  • devtools 包(用于创建包所涉及的大部分功能)
  • roxygen2 包(用于 roxygen 文档)

如果您没有上述软件包,您可以分别使用以下命令安装它们:

install.packages("devtools")

install.packages("roxygen2")

步骤:

(1) 使用 library(devtools) 在 RStudio 中导入开发工具。

(devtools 是一个核心包,使用它的工具可以更轻松地创建 R 包)

(2) 使用以下方法创建您的包:

create_package("~/directory/package_name") 用于自定义目录。

create_package("package_name") 如果您希望在当前工作区目录中创建包。

(3) 执行此函数后不久,它将打开一个新的 RStudio session。您会观察到,在旧的 session 中,有些行将是 auto-generated,这基本上告诉 R 在指定目录中创建一个包含所需组件的新包。

在此之后,我们完成了 RStudio 的旧实例。我们将继续开发新的 RStudio session window。

到目前为止,包创建部分已经结束(是的,就这么简单)但是,一个包不能仅仅通过创建就可以直接运行,而且您需要在其中包含一个函数这一事实需要一些额外的方面一个包,例如它的文档(其中使用 @param@return 等提到的函数的标题、参数、return 类型、示例等 - 如果您看到 roxygen 文档,您会很熟悉一些 github 个存储库)和 R CMD 检查以使其正常工作。

我将在后续步骤中介绍,但如果您想验证您的包是否已创建,您可以查看:

  • 新版RStudio右上角session,可以看到自己创建的包名

  • 控制台,你会看到R在我们在create_package()函数中指定的路径中创建了一个新的directory/folder。

  • RStudio 的文件面板 session,您会在其中注意到目录中的一堆新文件和目录。

(4) 正如您所说,您将函数放在脚本文件中 - 因此您需要先创建脚本,这可以使用以下方法完成:

use_r("function_name")

一个新的 R 脚本将在您的工作 session 中弹出,可供使用。 现在继续在其中编写您的函数。

(5) 完成后,您需要加载为包编写的函数。这是通过使用 devtools::load_all() 函数来完成的。

当您在控制台中执行 load_all() 时,当您在控制台中看到 Loading package_name 时,您将知道函数已加载到您的包中。 您可以尝试在控制台中调用您的函数,以验证它们是否作为包的一部分工作。

(6) 现在您的函数已经编写并加载到您的包中,是时候进行检查了。当我们对包进行更改时,检查整个包是一个很好的做法。函数 devtools::check() 提供了一种简单的方法来做到这一点。

尝试在控制台中执行 check(),它将通过一系列程序检查您的包裹是否 warnings/errors 并提供与屏幕上的消息相同的详细信息(关于什么是errors/warnings/notes)。最后的 R CMD check 结果将包含重要日志,供您查看您遇到的错误和警告及其频率。

如果你的包中的函数写得很好,(处理了额外的包依赖)它会在执行 check:

时给你两个警告

第一个警告将与您的包使用的许可证有关,该许可证未针对新包指定。

第二个应该是文档,警告我们我们的代码没有文档。

要解决第一个问题,即许可证,请使用 use_mit_license("license_holder_name") 命令(或任何其他适合您的软件包的许可证 - 但如您提到的那样供私人使用,您使用什么并不重要指定是否只使用它或不分发它)用你的名字代替 license_holder_name 或任何适合许可证名称的东西。 这将在 .DESCRIPTION 文件(在您的文件面板中)中添加许可证字段,并创建添加许可证信息的其他文件。

您还需要编辑 .DESCRIPTION 文件,其中 self-explanatory 字段需要 fill-in 或编辑。这是您如何拥有它的示例:

Package: Your_package_name
Title: Give a brief title
Version: 1.0.0.0
Authors@R: 
    person(given = "Your_first_name",
           family = "Your_surname/family_name",
           role = c("package_creator", "author"),
           email = "youremailaddress@gmail.com",
           comment = c(ORCID = "YOUR-ORCID-ID"))
Description: Give a brief description considering your package functionality.
License: will be updated with whatever license you provide, the above step will take care of this line.
Encoding: UTF-8
LazyData: true

要解决文档警告,您需要使用 roxygen 文档记录您的函数。一个例子e:

#' @param a parameter one
#' @param b parameter two
#' @return sum of a and b
#' @export
#'
#' @examples 
#' yourfunction(1,2)
yourfunction <- function(a,b)
{
  sum <- a+b
  return(sum)
}

遵循 roxygen 语法并根据需要添加属性,有些属性可能是可选的,例如 @title 用于指定标题,而其他属性如 @import 是必需的(必须),如果您从其他导入基本 R 以外的软件包。

在您使用 Roxygen 框架完成功能文档记录后,我们可以通过 运行 devtools::document() 告诉我们的包我们已经记录了我们的功能。执行 document() 命令后,再次执行 check() 以查看是否收到任何警告。如果你不这样做,那就意味着你可以走了。 (如果你按照步骤做,你不会的)

最后,您需要安装包,以便 R 可以访问它。只需使用 install() 命令(是的,与您一开始使用的命令相同,只是您不需要在此处指定包,例如 install("package"),因为您当前正在加载包并准备好 deployed/installed) 的实例中工作,并且在安装几行后您会看到类似 "Done (package_name)",说明我们的包安装完成。

现在您可以通过先使用 library("package_name") 导入包然后从包中调用所需的函数来尝试您的函数。就是这样,恭喜你做到了!

我试图以一种清晰的方式(我创建 R 程序包的方式)包含该过程,但如果您有任何疑问,请随时提问。