R包开发的标准姿势

文章目录

    • 建立R包项目
    • 打开项目文件夹
    • 编写DESCRIPTION文件
    • 编写R函数
    • 编写文档
    • 建立数据
    • 数据文件描述
    • devtools
    • 生成包
    • 试用
    • 完善
    • 发表

一个R包本质上就是一系列函数的集合,通过调用R包的函数从而实现相应的功能。R包开发对R语言编程能力提升有极大帮助,更能方便理解他人编写的包,而不仅仅调参。

R语言已经存在上万的开源包,总会有一个包满足需求。当一个真香的调参侠才可节省时间。

以windows系统为平台,这里展示一个开发R包的简单流程。通过R包的形式实现一个多分类变量哑变量的功能。

可以回复easydummy下载这个文件夹,双击文件夹内easydummy.RprojRstudio打开项目。也可以手撸代码。

哑变量是以多分类变量取值为变量,生成1是,0否的情况。如多分类变量为喜欢吃的水果,取值为苹果、香蕉、西瓜。哑变量后,苹果、香蕉、西瓜各自为一个单独变量,取值为1代表喜欢吃,0代表不喜欢吃。

必要条件

  • 软件
    • Rstudio(R语言最佳工具)
    • Rtools(win用户需要安装Rtools。使用Rstudio生成R包时会提示安装,自动配置环境)
    • devtools(R包开发辅助包可以帮助生成文档之类内容)
    • 安装install.packages("devtools")

本次包的开发需要使用stringr包,自行安装。

建立R包项目

Rstudio中点击File - New Project - New Directory - R Package - 给自己R包取名和选择包地址,确定即可。

这里命名为easydummy

R包开发的标准姿势_第1张图片

打开项目文件夹

可以看到easydummy文件包含以下内容

  • man(编写帮助文档,平时help()函数查看的就是这里面的内容)
  • R(存放R代码的地方)
  • DESCRIPTION(R包的相关描述)
  • NAMESPACE(用来规定可以调用的R函数功能,如果这里没有写明,即是R文件夹里面有相关函数功能也不能在之后调用)
  • 其他(一些项目地址之类的内容,不需要理会)
    R包开发的标准姿势_第2张图片

Rstudio在建立R包项目时会自动生成一个Hello函数,这里把R文件夹hello.Rman文件夹hello.Rd以及NAMESPACE文件删除。

这三者存在联动关系。实际开发中,使用devtools等辅助包相关函数,可以关注于R函数的编写,自动生成man文件夹NAMESPACE文件相关内容。

编写DESCRIPTION文件

在Rstudio中打开DESCRTION文件,编写包的描述。

相关内容包括:

  • Package:包的名字
  • Type: Package(类型)
  • Title: 包的介绍,这里的内容就是RstudioPackages面板下各种包的描述
  • Version: 0.1.0(版本号,版本号存在一定规范。这里只是一个简单的R包开发教程,不需理会)
  • Author: 作者
  • Maintainer: The package maintainer [email protected](包的贡献者名字及邮箱)
  • Description: 包的描述
  • License: 许可证(包的公共许可,开源程序的特色。这里也不理会,以GPL-3为协议)
  • Encoding: UTF-8(编码方式)
  • LazyData: true(R包内置数据时选中)
  • Depends : 依赖环境
  • Imports : 需要使用的包
  • Suggests: 建议配合使用的包
  • 其他如网址、bug报告地址等内容,这里不涉及。

本包的DESCRIPTION如下:

Package: easydummy
Type: Package
Title: make dummy easy
Version: 0.1.0
Author: DA_BY_R
Maintainer: DA_BY_R 
Description: this package was my first package
License: GPL-3
Depends:
  R (>= 3.5.0)
Imports:
	stringr,
    stats
Encoding: UTF-8
LazyData: true

Imports导入包需要使用usethis::use_package('包名')生成。
如usethis::use_package(‘stringr’),usethis::use_package(‘stats’)

编写R函数

Rstudio中File - New File - R Script生成一个文件,将其命名为easydummy.R,保存在项目R文件夹内。

接下来就是在easydummy文件中编写函数内容,以实现功能

学会调用各种基本函数,实现各种功能的过程,对R语言的理解、函数调用与熟悉具有极大的提升。

实现一个哑变量功能,基本函数如下。

本次仅介绍R语言包的开发过程。具体的函数内容并不需要理会,直接复制即可(#后注释如果有碍观瞻,也可以删除)。仅仅是为了说明R函数功能实现的思路

要实现哑变量功能,需要数据和需要哑变量化的变量位置。因此这里选择两个参数

data:数据框类型数据

loc:变量的位置

easydummy <- function(data,loc) {
#需要数据没有缺失值
#complete.cases函数判断数据各行是否完整
#which函数确定提取完整数据的行的位置
#依次选中无缺失值数据
  data <- data[which(complete.cases(data)),]
  #用apply向量化函数替代for循环,遍历数据
  #用unique函数求各列(变量)唯一值
  unique <- apply(data, 2, unique)
  #得到需要哑变量化的变量的唯一值
  values <- unique[[loc]]
  #建立一个仅含一个变量的空数据框。
  #变量名可以是任何名字(x,y,z之类)会删除。
  zero <- data.frame(z=0)
  #用for循环遍历唯一值,将各取值化作变量。
  for (val in values) {
    zero[val] <- 0
  }
  #删除第一列,即删除z变量
  #这时为仅含唯一值转化的变量的空数据框
  z <- zero[-1]
  #for循环嵌套for循环
  #第一个for循环遍历数据各行
  #第二个for循环遍历各唯一值
  for (i in 1:nrow(data)) {
    for (len in 1:length(values)) {
    #用stringr包str_detect函数检测哑变量的那一列的每行是否存在各唯一值
      if (str_detect(data[i,loc],values[len])==TRUE) {
      #如果存在的话,z空数据框的i行len列等于1
        z[i,len]=1
      }else{
      #如果不存在的话,z空数据框的i行len列等于0
        z[i,len]=0
      }
    }
  }
  #用cbind函数将原数据与z数据框拼接,命名为data
  data <- cbind(data,z)
  #返回data数据框
  return(data)
}

这个函数如果仔细看还有许多粗糙与改进之处,如哑变量要求多分类变量,可以用变量类型是否为因子类型缩小搜索范围。for循环是否可以用向量化函数提升等等。

编写文档

使用devtools包相关功能可以专注于R函数功能,编写文档只需要在R函数文件内代码上方以#‘开头加入各种roxygen2包相关函数即可(无需加载)。

一般来说:

  • 第一段标题

空行

  • 第二段描述

空行

  • 第三段细节

接下来是一些细节文档

  • @param 函数参数
  • @return 说明本函数返回值
  • @importFrom 包名 函数名 函数名
  • @export不添加,这个函数就不显示也就不能直接使用
  • @examples提供示例代码

easydummy函数的代码与文档描述为:

#'@title  easydummy
#'
#'@description  a friendly funtion that dummy your data
#'
#'@details  I used some funtions in base R,like unique,gen a new funtion.
#'by the way,this is my first package,it's true.
#'
#'@param data need a dataframe
#'@param loc  location of your want dummy
#'@return a dataframe
#'@importFrom stats complete.cases
#'@importFrom stringr str_detect
#'@export
#'@examples
#'easydummy(iris,5)
easydummy <- function(data,loc) {
  data <- data[which(complete.cases(data)),]
  unique <- apply(data, 2, unique)
  values <- unique[[loc]]
  zero <- data.frame(z=0)
  for (val in values) {
    zero[val] <- 0
  }
  z <- zero[-1]
  for (i in 1:nrow(data)) {
    for (len in 1:length(values)) {
      if (str_detect(data[i,loc],values[len])==TRUE) {
        z[i,len]=1
      }else{
        z[i,len]=0
      }
    }
  }
  data <- cbind(data,z)
  return(data)
}

建立数据

可以内置数据,以方便包的函数功能展示。

  • easydummy文件夹内新建data文件夹

  • 使用save(数据,file=‘文件名.rda’)方式生成数据

save(iris,file = 'iris.rda')

  • rda文件放在data文件夹下

数据文件描述

如果内置数据同样需要描述(过程与R代码文档类似),在R文件夹内生成data同名R文件iris.R

依次填写:

  • 标题
  • 描述
  • @docType data (必须填写,类型必须为data)
  • @name 数据名 (必须填写)
  • @format说明文件格式(可选)
  • @soure说明数据来源(可选)
  • NULL(这个文件内容不能为空,否则不能检测,填写NULL表示下存在感)
  • 其他

本包数据描述为:

#'somedata
#'
#'used to  demo of this package
#'@docType data
#'@name iris
NULL

devtools

使用devtools包document()函数自动生成文档

Rstudio中ConSole面板输入devtools::document()

duang~

man文件夹内的内容与NAMESPACE文件就自动生成了

devtools::document()
#余下为输出结果(有删减)
Updating easydummy documentation
Writing NAMESPACE
Loading easydummy
Writing NAMESPACE
Writing easydummy.Rd
Writing iris.Rd

生成包

Rstudio中点击Build面板Installand Restart,即自动打包.

也可以点击Check检查是否符合规范

R包开发的标准姿势_第3张图片

试用

生成包完成后可以试用包的效果,以便修改完善。

使用help函数help('easydummy',package = 'easydummy')
可以看到和其他包一样的帮助文档
R包开发的标准姿势_第4张图片

函数试用

data <- easydummy(iris,5)
View(data)

完善

这仅仅是一个功能单一的R包,可以不断添加函数,以完善包。还可以为这个包添加demo和pdf文档等等。

具体可以参考书籍:

  • Hadley Wickham:R Packages,
  • Writing R Extensions:繁杂细致

发表

主要发表平台为:

  • cran(符合cran规范)
  • github(没有条件)

作为一个自用野包,放在github上,使用devtools包安装即可。当然某天野包也会转正。


R 语 言 小 白 速 通 R语言小白速通 R
懂 点 R 语 言 懂点R语言 R
欢 迎 分 享 收 藏 关 注 欢迎分享收藏关注

你可能感兴趣的:(R语言,R语言,R包开发,devtools,dummy,哑变量)