R包概述
R包,类似C、Python中库的概念,指包含特定领域的函数、数据、文档等的集合。通过调用包,可以直接使用包中现成的数据、函数等,使开发方便快捷高效。
创建R包后,在包的根目录下,一般包含以下几个部分(粗体表示必需):
为了有效利用R包,一般遵循以下的工作流程:
下面,将以一个HelloWorld的例子,沿着上述工作流程,开发R包。
安装R包,需要执行以下代码:
install.packages(c("devtools", "roxygen2", "testthat", "knitr"))
install.packages("rstudioapi")
rstudioapi::isAvailable("0.99.149")
devtools::install_github("hadley/devtools")
同时,还需要C编译器以及一些命令行工具,建议使用和RStudio,其会自动安装相关程序。
准备完毕,使用下面代码进行验证,返回为TRUE
即成功。
library(devtools)
[1] TRUE
首先,确定包的名字与工作路径,然后通过下述指令创建包hello
:
# 确定路径为E:/Github/
# 确定名字为hello
devtools::create('E:/Github/hello')
然后生成文档结构如下:
hello:.
│ .gitignore
│ .Rbuildignore
│ DESCRIPTION
│ hello.Rproj
│ NAMESPACE
│
└─R
打开DESCRIPTION文件,按照里面的要求编写即可,这里我们把Title改成HelloWorld,把Version改成0.1,修改后的文件如下:
Package: hello
Title: HelloWorld
Version: 0.1
Authors@R: person("First", "Last", email = "first.last@example.com", role = c("aut", "cre"))
Description: What the package does (one paragraph).
Depends: R (>= 3.3.1)
License: What license is it under?
Encoding: UTF-8
LazyData: true
一般来说,为了复用性与测试,需要包中包含一些测试文件。
添加数据文件的方法如下,先生成数据文件,然后通过use_data
函数添加到hello
库中,这样当加载库的时候,相应的数据文件也被加载进来了,可以直接使用。
countries = c('CHINA','USA')
devtools::use_data(countries, hello)
每个包的目的都是完成特定的功能。为了完成特定的功能,需要编写R函数。这里,我们编写R函数如下,其功能是读取countries数据,并且打印形如hello countries
的字符串:
hello_country <- function(countries) {
hellos = paste('Hello',countries)
for (i in hellos ){
print(i)
}
}
通过在包中编写R函数,以后每次需要包中函数的时候,直接载入包就可以了,方便快捷。
对于每个R函数,需要编写R文档,包含R函数的功能、调用、使用方法等。 R文档的编写方式如下:
#' Hello Country
#' @param countries string vertices countaining countries.
#' @examples
#' hello_country(countries)
#' @export
hello_country <- function(countries) {
hellos = paste('Hello',countries)
for (i in hellos ){
print(i)
}
}
其中,第一行是标题,@param
后面是输入参数,@examples
后面是例子,@export
表示该函数可以被外部调用。
编写完成后,执行devtools::document()
即可生成文档,生成的文档在\man
目录下,此例中生成了hello_country.Rd
文件。
重新建立包,执行?hello_country
即可预览生成的R文档。
每个R函数编写完成后,需要对其进行测试,测试的文件放在\test
文件夹下。
本例的测试文件为:
hello_country(countries)
其会输出:
[1] "Hello CHINA"
[1] "Hello USA"
每个项目需要有一个完整的说明文档。生成文档的方法如下:
devtools::use_vignette("hello-tutorial")
生成文档后,使用rmarkdown的语法进行编写如下:
---
title: "Hello_Tutorial"
output: html_document
---
This is a simple illstration of hello package. It only contains one main functin which is `hello_country` and one dataset `countries`.
The use of this funciton is:
```{r}
library(hello)
hello_country(countries)
```
建议使用RStudio,生成包只需要点击Build
标签页中的Build and Reload
即可。
同样的,使用devtools::build()
亦可。