R包的开发
需要安装devtools包。
https://cran.r-project.org/web/packages/devtools/devtools.pdf
1、devtools::create(path)
在该path路径下创建一个开发R包必须要的一些文件(包括放最后生成的help文档的man文件夹,放主要代码的R文件夹,描述文件DESCRIPTION,命名空间文件 NAMESPACE,项目文件pkgname.Rproj)
也可直接使用Rstudio
(1) Rstudio的左上角,file-New project-New Directory -R package
(2)写出包名,选好路径,点击创建
2、在R文件夹下开发代码
Tips:
1、在R包中,所有R文件都要添加到R文件夹中。注意不能在R文件夹中放入子文件夹,否则roxygen2的document文件无法写入
2、注意代码规范,参考https://nanx.me/rstyle/,
1)在Rstudio直接CTRL+A全选代码后,用CTRL+SHIFT+A可自动美化代码
2)安装styler包,添加到Rstduio插件中,选择Style active file,然后CTRL+SHIFT+A可美化代码
3)formatR包
#use the library "formatR"
install.packages("formatR")
library(formatR)
# tidy_eval("file path")
tidy_eval("C:/Users/PC_name/Desktop/myfile.R")
暂时没对比三种方法差异,要注意一下如果代码和注释在一行,可能自动标准化后会有误,需要注释单独在一行
3、主要函数的注释
()
在函数上方用 #' 符号为函数添加文档。
函数文档分几个部分。
1)标题,只能占用一行,不长于80个字符。
2)详细介绍,空一行之后,可以占用多行。第二段开始会放入文档的details中。每行同样不能超过80个字符。
3)examples。在文档中添加@examples或@example后添加R语句,即为文档的例子。
4)返回值,在文档中添加@return之后添加返回值解释。
5)引用其他文档段,添加@describein或@rdname域,并加上文档名,即可直接引用其他的文档段。这两个域的区别是,添加@describein之后仍然可以添加其他的文档内容。而使用@rdname的话,在此域后面,只能用域来添加文档,不能添加description文档。所有没有域名的文档都必须添加到@rdname的上方。
6)添加外部函数,如果当前函数使用了第三方包的函数,则有两种方法来使用此函数。第一种,
是在roxygen注释中添加@import pkg。这种方法会在R包的NAMESPACE文件中添加import域,在加载R包时,第三方包的所有函数都会被导入。在使用函数时必须用pkg::fun的方法,以防函数名冲突。第二种方法,是在roxygen注释中添加@importFrom pkg fun。这种方法会在NAMESPACE文件中添加importFrom域,在使用时可以直接使用函数名,就像在.GlobalEnv中创建的函数一样。这里推荐第二种引用方法,因为可以大幅减少函数冲突。
7) 决定是否导出函数。并不是所有定义了的函数都要让用户直接使用。对于那些你想让用户直接使用的函数,需要在NAMESPACE文件中添加export域:export(func)。这里的处理方法是在roxygen注释中添加@export。之后,此函数会被自动添加到NAMESPACE中。在对包进行测试时,要多export一些函数,避免重复安装包导致的繁琐工作
8)其它:@format: 说明格式。@param param description: 参数说明
#' 函数的说明标题.
#'
#' 函数的细节说明
#' 可多行.
#' @import SC3
#' SingleCellExperiment
#'
#' @param data Input matrix or data frame.
#' The rows represent items while the columns represent features.
#' @param Kmax The maximum number of clusters.
#' The algorithm runs from \code{k = 2} to \code{k = kMax}. Default value is
#' \code{10}.
#' @return \item{x}{multi-source data.}
#' \item{truex}{multi-source data without noise.}
#' @export
#' @examples
#' data(Ramskold)
#' tmp(data = data, Kmax = 2)
tmp <- function(data, Kmax = 10){
list(x=x,truex=truex)
}
4、测试
devtools::load_all() 加载包里所有函数 可以对其进行调用测试
devtools::run_examples() 运行包里面的所有examples
5、写DESCRIPTION
Package: 包的名称
Type: Package
Title: 包的介绍的标题
Version: 0.1.0
Author: Zhao Shan,Li Si 两个人名中间用逗号隔开
Maintainer: Zhao Shan <1234@qq.com>,Li Si <1234@qq.com> 人名后空格<邮箱> 两个人名中间用逗号
Description: 包的描述
License: GPL
Encoding: UTF-8
LazyData: true 若R包中有数据,将数据保存为RData格式,创建一个data文件夹,放在里面,将此处改为True
Imports: 需依赖的其他包 包名称之间逗号隔开
Suggests: ggplot2 建议安装的包
RoxygenNote: 7.1.1
Depends: R (>= 3.5.0)
6、devtools::document()
devtools::document()为R包生成文档。每个R文件的文档会分别以file.Rd格式存在man文件夹中
使用前先删掉 NAMESPACE和man文件夹,会自动生成。
7、devtools::build()
生成一个.tar.gz格式的压缩包,这就是我们最终封装好的R包
8、安装再次测试
install.packages("path/package.tar.gz", repos = NULL, type = "source")