为什么要有属于自己的pakage
- 简化重复性的工作
- 更便捷的与他人分享代码
- 梦想可以在CRAN上发表
一个可安装的R包的结构
- R目录 (存放code,一般是函数)
- man目录 (Rd文件,存放函数说明文件)
- NAMESPACE文件(说明从其他包引用的函数,以及我们的包生成的函数)
- DESCRIPTION文件 (注明包的作者,依赖关系,许可证书等)
- Data(存放数据,有些R包就是专门的数据包)
- Vignettes (使用说明)
- 等等…
以上只有前四部份是必要的结构,因为今天只是希望快速建立自己的R包,具体细节和其他部分会在后续文章说明。这四个部分中只有第一和第四部分是需要手写,第二部分简单的代码就可以完成,第三部分暂时不用管
开发环境和工具
win 10
Rstudio
R (version 3.6.0)
需要使用的R包:devtools;roxygen2
创建项目
> # 清空内存
> rm(list=ls())
> 加载包
> library(devtools)
> library(roxygen2)
> #设置工作路径,后续的R包就生成在这里,我是在D盘
> setwd("D:/")
> # 创建R包,这里要注意取名时要尽量简洁易懂,且不要和已有的CRAN上的包重复
> create_pakage("toolr")
此时一个新的rstudio窗口自动打开
注意界面的左上角标明了项目的路径
打开D盘可以看到多了一个叫做toolr
的文件夹,我们也可以从Rstudio界面的右下角看到这个文件夹
之前提到的四大必要组成部分除了man
目录,都在其中了。
编写函数
直接Ctr+Shif+N
新建一个R脚本,并将以.R
文件的格式保存在toolr
中的R目录下,文件名最好是简易标明函数功能,方便以后查看,这里我的.R
文件名为sumtwo
在sumtwo中建立一个求和函数
编写roxygen
roxygen其实就是对函数的注释,只是在编写包时要使用已经规范的格式
- @param 标明参数的含义
- @return 标明输出结果的格式
- @export 标明该函数是在加载包后可以直接使用的,如果没有这个参数,加载包后要用
toolr:::sumtwo
的格式调用函数 - @example 标明例子
快捷键Ctrl+Shift+Alt+R
添加roxygen
模板
在模板上做一些修改
保存
添加man目录
一行代码即可,但是一定要注意:代码不要在sumtwo.R
的脚本中写,最好是新开一个脚本,或者在sumtwo.R
中写完运行后删除
> document("D:/toolr")
其中的"D:/toolr"
也可替换为"."
此时在toolr
目录下可以看到man
文件夹了,man
目录下有一个sumtwo.Rd
文件,其中记录着对sumtwo
函数的解释
修改DESCRIPTION
打开description,可以看到需要修改的部分有标题、版本号、作者信息、描述、许可证书(自用的话可以先不去理解它)等等
我在这里大致做了一些修改,其中Authors@R
一栏可以添加多人,每个人的信息包含在一个person()
中,role
表示角色,具体ant
,cre
指代什么后续再说
记得保存
BUILD
到此处,toolr
包的准备工作已经完成,build
之后就可以使用了!
> #先加载pkgbuild包
> library(pkgbuild)
> build(path="D:/toolr")
[1] "D://toolr_1.0.0.tar.gz"
此时检查D盘会发现,出现了一个后缀为.tar.gz
的文件,这就是我们建立起来的R包!
安装并测试
在Rstudio右上角关闭项目
新开一个Rstudio界面,安装toolr
包
> # 安装并load
> install.packages("D:/toolr_1.0.0.tar.gz",repos = NULL,type = "source")
> library(toolr)
> # 查看包中函数
> ls("package:toolr")
[1] "sumtwo"
> # 测试
> sumtwo(1.2,3)
[1] 4.2
> sumtwo("1",2)
[1] Error in sumtwo("1", 2) : input must be numeric
到此为止,一个极简的R包就建立完成了,后续我将尝试加入更多的函数,完善一些细节和可加入的结构,并发布至GitHub
。
我要考研了,今年12月之后更新。
上传至github
打开github,新建一个repo,我这里命名为R_code,然后将本地文件夹toolr上传至该repo即可。
从github安装toolr
library(devtools)
options(download.file.method = "libcurl") #防止链接出现问题
install_github("josephcui/R_code/toolr")