查看原文
其他

开发基于GUI的R包(2)

徐静 R语言中文社区 2019-04-22

作者: 徐静 硕士研究生、算法工程师 兴趣方向:统计机器学习,深度学习,模型的线上化部署、网络爬虫,前端可视化。

个人博客:<https://dataxujing.github.io/>


往期回顾:

开发基于GUI的R包(1)

上一次和大家分享了开发基于GUI的R包的第一部分:代码的主题部分,详细参考:《开发基于GUI的R包(1)》。R包的基本构造比较简单,写过R包的小朋友都很明了,不过还是列一下做简单说明,具体的参考Writing R Extensions内有详细的介绍。一般的R包的结构为:

```
testR(包的名字,这里包的名字叫testR)
|
|--DESCRIPTION(描述文件,包括包的名字,
                  版本号,标题,描述,依赖关系)
|--R(函数源文件)
   |--function1.R
   |--function2.R
   |--...
   |--zzz.R(如果包中包含一些非R的脚本比如:C,C++,Java,......)
|--man(帮助文档)
   |--function1.Rd
   |--function2.Rd
   |--testR-package.Rd
   |--...
|--NAMESPACE(命名空间,有些方法不希望被使用者看到,可以在这设置)
|--vignettes(包的描述文件,可以用rmarkdown写)
|--src(非R脚本eg.C.C++,Python,java)
|--data(R包中的数据,最好是.rda格式)
|--demo(R包中的demo)
|--test(R包中的测试代码)
|--...
```

具体这些文件怎样写下面会以Ricetl包为例做简单介绍。

 1.创建一个空的R包

RStudio是我认为目前最好用的一款R IDE,Ricetl包的创建流程也是基于RStudio去完成的(Ubuntu下可以使用Rstudio server),也可以通用代码创建:

```R
devtools::create('/home/xujing/R/Github/Ricetl')
```

或者基于Rstudio创建:

创建好了空的包,就可以在Rstudio的工作空间中进行第二步:编写R函数和函数说明文档

2.编写R函数和函数说明文档

(1).写包的一些核心代码,可以基于一些面向对象的编程思想:

(2).写.Rd文档


最后编译后会生成man文件夹中的.Rd文档

或者运行代码

```
devtools::document()
```

生成的文档在\man目录下,此例中生成了Ricetl.Rd,......文件。关于roxygen2的使用可以参考详细的教程。 最终结果如下:


3.添加data文件

如果包中包含了一些公共的数据集,添加在data文件夹中,如图:


4.test文件夹

每个R函数编写完成后,需要对其进行测试,测试的文件放在\test文件夹下。 本例的测试文件为:

```R
Ricetl()
x <- c('654003198111200241','341881197709275718','340503199401248097','469030199406204103','51110019')
#age
id2age(x)
#gender
id2gender(x)
#address
id2address(x)
#Verifying the true and false
id2verify(x)
```

5.如果有非R脚本

此段来自:统计值都,谢益辉大神的文章 (:

```
在 src 目录下我们可以放置一些其它语言的源代码,里面可能包含一些函数,这些函数在被编译之后,(以 C 语言为例)可以在 R 代码中以.C(‘routine_name’, …, package = ‘pkg’)的形式调用,但要注意,如果需要用这个功能,在 R 目录下需要有一个 zzz.R 文件(这个特殊文件是用来在加载包之前加载运行的代码),里面写上:
.onLoad <- function(lib, pkg) {
    library.dynam("pkg_name", pkg, lib)  #pkg_name是你的包的名字
}
```

这些内容我没有尝试过,详细内容还请深挖 R-exts

6.其他

还有其他得让文件比如:demo、exec、po和tools等具体用到自己去查。

7.我喜欢最后写DESCRIPTION文档

```
Package: Ricetl
Type: Package
Title: Data Extraction for People's Republic of China Resident Identity Card
Version: 0.2.5
Author: Xu Jing [cre, aut]
Maintainer: Xu Jing <274762204@qq.com>
Description: People's Republic of China resident identity card contains a lot of personal information. 
    It can extract the location of the household's residence in the identity card, the date of birth, the sex, 
    the location of the registered police station, and can identify the authenticity of the ID card through the check code. 
    'Ricetl' provides graphical user interface to process the function of extracting the above effective private information in the ID card number,
    and provides a public data set related to the ID number.
License:  GPL (>= 2)
Encoding: UTF-8
LazyData: true
URL: https://github.com/DataXujing/Ricetl
BugReports: https://github.com/DataXujing/Ricetl/issues
RoxygenNote: 6.0.1
Depends: R (>= 3.4.0)
Imports: gWidgets, readr, readxl, stringr, tidyverse, writexl, devtools, plyr, gWidgetsRGtk2
Suggests: rmarkdown, knitr
VignetteBuilder: knitr
```

8.每个项目需要有一个完整的说明文档vignettes

生成文档的方法如下:devtools::use_vignette("Ricetl-doc") 这是一个rmarkdown文档,你可以编辑描述自己的package,当然也可以使用pkgdown包(类似于python中的mkdocs)为自己的包写一个在线的说明文档。

这些东西做好之后就可以生成自己的包,R包的种类有很多比如:

  • source包 : 开发时的源代码包,包含R/、DESCRIPTION等

  • bundled包:将source包reduced成一个单个文件(.tar), 使用gzip(.gz)压缩成一个.tar.gz文件的包(在linux常看到的包名后缀),它和source包的区别在于: Vignettes被编译成了HTML和PDF文件 没有了source包中的临时文件 (source包中.Rbuildignore文件中标明的文件被排除在bundled包外)

  • binary包:binary包可供没有编译环境的R用户使用,它也是单个文件,但是解压开和source包差别很大 (注意:binary包和平台相关,Mac的包.tgz和Windows的.zip不能通用) R/文件夹中并没有R文件,而是3个解析后可供高效调用的文件,这是加载R代码用save()函数保存的结果 Meta/文件夹包含一些rd文件,这些是包相关的元数据缓存,可以用readRDS()查看文件内容,这些文件加速了包的加载 html/文件夹包含了HTML帮助需要的文件 src/目录变成libs/目录,包含了将源代码编译成的库 inst/的内容被移到了顶层目录

  • installed包:installed包是将binary包解压(安装)到特定的库目录,如下图展示了包的不同安装方法

9.生成自己的R包

按照下面的步骤就可以生成自己的R包:

  1. Build > Configure Build Tools 路径

  2. 现在检查 “Generatedocumentation with Roxygen”选项,并在 Check Package space 下放入“–as-cran”来模拟 CRAN 检查和测试包的操作。

  3. 进入 Build > Clean and Rebuild 路径

    点击这个将创建包并在当前环境下加载这个包。

  4. 在本地细致的测试你的R包,过程中没有问题就可以把R包共享给开原组织,小伙伴,或使用opencpu进行模型线上化部署。

13.发布自己的R包

当你成功创建一个 R 包时,你将乐于将其分享给其他人,以使他们也能用到你包内的函数。在发布包的过程中我会用到两大平台:CRAN 和 GitHub.

  1. 在 CRAN 上发布你的R包

    将包发布在 CRAN 上是较难的一步,因为在成功发布前要对包进行大量的严格测试。除了通过这些测试,你需要给出关于包的运行的详尽描述。这些描述将存储在 vignettes 文件夹中,你可在主项目目录中创建该文件夹。 当你已确认你的包在本地模拟测试中运行良好并且正常记录后,你需要进入Build > Build Source Package 路径创建源码包。

    在创建完源码包后,你可提交在此(https://cran.r-project.org/submit.html)提交在 CRAN 上发布此包的申请。

    按照提示上传 tar 包,填写资料等。有问题的话过不久管理员会发信息到电子邮件,按照电子邮件修改之后再上传

    最后你要时常定期更新维护自己的R包,更新维护方法与上述提交方法相同,如果你的R包不做长期维护,CRAN会将你的包下架。

  2. 在Github上发布你的R包

    ‘Github全世界最大的同性交友网站’,可以把自己R包的开发版本通过Git托管到Github,这样我们可以方便的定期维护自己的R包,并且可以很好的实现程序yuan(猿,媛)之间的协同开发和版本控制。

  3. 可以在R环境中安装你的R包了!

    在CRAN上可以通过命令`install.packages('Ricetl')`安装,Github上可以通过`devtools::install_github('DataXujing/Ricetl')`或`devtools::install_github('cran/Ricetl')`安装。这样就可以使用了。

这样我们就实现了一个简单的基于GUI的R包的开发并成功的托管到CRAN和Github,

这里只是简单的介绍R包开发的流程,由于篇幅有限可以线下私自交流,其实要完成一个完美的R包的开发还需要很多R底层的东西,希望我的简单介绍能帮助到大家。




大家都在看

2017年R语言发展报告(国内)

R语言中文社区历史文章整理(作者篇)

R语言中文社区历史文章整理(类型篇)


公众号后台回复关键字即可学习

回复 R                  R语言快速入门及数据挖掘 
回复 Kaggle案例  Kaggle十大案例精讲(连载中)
回复 文本挖掘      手把手教你做文本挖掘
回复 可视化          R语言可视化在商务场景中的应用 
回复 大数据         大数据系列免费视频教程 
回复 量化投资      张丹教你如何用R语言量化投资 
回复 用户画像      京东大数据,揭秘用户画像
回复 数据挖掘     常用数据挖掘算法原理解释与应用
回复 机器学习     人工智能系列之机器学习与实践
回复 爬虫            R语言爬虫实战案例分享

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存