讲真,用R这么几年,始终未尝试过写自己的包,看来这就是我与真正程序员的差距了——编程习惯等于没有。

昨天一个偶然的机会想开始写自己的工具包,发现了前期教程的有一些过时。于是,写一个**windows**下新的简易版参考,以备不时之需。内容基本来源为男神Hadley Wickham的Advanced R programming一书。 PS:通过以下教程写出来的包还不能放到CRAN上,仅方便自己的代码移植;如果你想让自己的function在CRAN扬名立万,还需要做很多其他的工作。

那些年需要做的准备工作

    首先,安装Rtools: http://cran.r-project.org/bin/windows/Rtools/,想必你已经知道了这并不是一个R的包;
其次,最好有一个Rstudio;
再次,愉快的安装devtools包吧:
install.packages("devtools",dependencies=T)

  

    好了,准备工作就绪,打开一个新的脚本,即可以开始写包之旅。

检测环境

library(devtools)
has_devel()#诊断环境
    利用has_devel函数检测当前的环境是否有问题,比如gcc,可能因为我也忘记了自己之前之前配置过什么,反正总之就是没问题哈哈,是的只要返回值是TRUE就没问题。

早就说了要开始现在才开始

create("H:/WorkingSpace/RWorkingSpace/BigFaceTools")#创建包的文件夹,文件夹名就是包的名字,比如我的就是大脸工具,囧……
setwd("H:/WorkingSpace/RWorkingSpace/BigFaceTools")#工作空间转移,这样比较方便
    值得一提的是,除了以上命令外,也可以通过Rstudio中的file-New Project-New Directory-R Package来新建R包的项目。
来看看这个项目的结构:
1.一个R的文件夹,用来存放.r脚本,比如你的常用function,放在这里即可;
2.一个基础的无后缀的DESCRIPTION文本文件,可以用任意文本编辑器打开,是对于你将创建的R包的基础介绍;
3.NAMESPACE文件,可以先不用管它;
总之,一个package的框架基本就有了,剩下的就是往里面填东西。

添加.r文件

    首先往包文件目录下的R文件夹内添加自己编写的R脚本,如果此时你没有合适的脚本那么随便写个function也是可以的:
print_intro=function(){
print("Laoliu is the most handsome man in this package! LOL...")
}
    无尽的心酸……
实际上,我自己写了很多小函数,放一个进去吧:
#' read all worksheet in one excel file to return a data.frame by using readxl
#' @param file,should be a file address str
#' @param sheet_name,if the sheetname be one column of the result
#' @export
read_all_xlsx_sheets=function(file,sheet_name=TRUE){
for(pkg in c("plyr","dplyr","magrittr","readxl")){
if(!requireNamespace(pkg,quietly=TRUE)){
stop(paste("The ",pkg," package needed for this function to work. Please install it.",sep=""),
call. = FALSE)
}
}
library(plyr,warn.conflicts=F)
library(dplyr,warn.conflicts=F)
library(readxl,warn.conflicts=F) tables=readxl::excel_sheets(file)
if(sheet_name){
res=plyr::ldply(tables,function(x)dplyr::mutate(readxl::read_excel(file,sheet=x),sheet_name=x))
}else{
res=plyr::ldply(tables,function(x)readxl::read_excel(file,sheet=x))
}
return(res)
}
    对各个参数注释后,把代码的.r文件放入BigFaceTools/R文件夹内,保存。

编辑DESCRIPTION

file.edit("DESCRIPTION")#编写描述文件

  

    打开时的样子:
Package: BigFaceTools
Title: What the Package Does (one line, title case)
Version: 0.0.0.9000
Authors@R: person("First", "Last", email = "first.last@example.com", role = c("aut", "cre"))
Description: What the package does (one paragraph).
Depends: R (>= 3.2.3)
License: What license is it under?
LazyData: true
    根据我的需要,把它编辑成了这样:
Package: BigFaceTools
Title: BigFace's data processing functions
Version: 0.0.0
Authors@R: person("Lao","Liu",email="LaoLiu@gmail.com",role=c("aut","cre"))
Description: BigFace's personalized data processing functions
Depends: R (>= 3.2.3)
Imports:plyr,dplyr,magrittr,RODBC
License: everyone
LazyData: true

Authors@R的格式必须要用person函数来写,其他的因为无上传打算,随意就好。
关于以上,因为在.r文件中引用了三个包,故把这三个包写入imports中,在后期加载时BigFaceTools自动加载这三个包。
use_package("plyr")
use_package("dplyr")
use_package("readxl")

准备打包

load_all()
    每一次运行load_all(),都会载入BigFaceTools/R内最新的所有.r文件内容。
read_all_xlsx_sheets("iris_test.xlsx")#测试
     如果没什么意外(其实会有,可以发现我载入了几个新的包,plyr、dplyr、magrittr,如果想用以上代码测试,建议安装),测试当然会通过。
document()

     接着用document()将BigFaceTools/R内的所有.r文件生成为BigFaceTools/man文件夹内的.Rd文件。

build()#打包
    打包成一个压缩文件,生成BigFaceTools_0.0.0.tar.gz,用于安装,这个文件会生成在BigFaceTools文件夹的上一级栏目。

    使用
install(".")
    安装,大功告成。
重启Rstudio,调用一下吧^0^
library(BigFaceTools)
test_file=system.file("iris_test.xlsx",package="BigFaceTools")#测试文件
read_all_excel_sheets(test_file)

     以下为全部代码奉上:
library(devtools)
has_devel()
create("H:/WorkingSpace/RWorkingSpace/BigFaceTools")
setwd("H:/WorkingSpace/RWorkingSpace/BigFaceTools")
file.edit("./R/BigFaceTools_1.r")#.r文件
file.edit('DESCRIPTION')#编写描述文件
use_package("plyr")
use_package("dplyr")
use_package("readxl") load_all()#载入R文件夹中的所有.r文件
read_all_xlsx_sheets("../iris_test.xlsx")#测试
document()#在man文件夹中生成对应的.Rd 文件 check()#看看有没有错误
build()#打包 install(pkg=".")#安装
##重启后再进来试试
library(BigFaceTools)
test_file="iris_test.xlsx"#测试文件
read_all_xlsx_sheets(test_file)

轻松创建R语言函数包的更多相关文章

  1. R语言 ggplot2包

    R语言  ggplot2包的学习   分析数据要做的第一件事情,就是观察它.对于每个变量,哪些值是最常见的?值域是大是小?是否有异常观测? ggplot2图形之基本语法: ggplot2的核心理念是将 ...

  2. R语言函数化编程笔记1

    R语言函数化编程笔记1 notes:有一个不错的网站叫做stack overflow,有问题可以从上面找或者搜索答案,会有大佬相助. 在github上面可以找到很多R的扩展包,如果自己额修改被接受,那 ...

  3. R语言-神经网络包RSNNS

    code{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && docu ...

  4. R语言dplyr包初探

    昨天学了一下R语言dplyr包,处理数据框还是很好用的.记录一下免得我忘记了... 先写一篇入门的,以后有空再写一篇详细的用法. #dplyr learning library(dplyr) #fil ...

  5. R语言函数化学习笔记3

    R语言函数化学习笔记3 R语言常用的一些命令函数 1.getwd()查看当前R的工作目录 2.setwd()修改当前工作目录 3.str()可以输出指定对象的结构(类型,位置等),同理还有class( ...

  6. R语言函数化编程笔记2

    R语言函数化编程笔记2 我学过很多的编程语言,可以我写的代码很啰嗦,一定是我太懒了.或许是基础不牢地动山摇 1.为什么要学函数 函数可以简化编程语言,减少重复代码或者说面向对象的作用 2.函数 2.1 ...

  7. R语言-Knitr包的详细使用说明

    R语言-Knitr包的详细使用说明 by 扬眉剑 来自数盟[总舵] 群:321311420 1.相关资料 1:自动化报告-谢益辉 https://github.com/yihui/r-ninja/bl ...

  8. R语言扩展包dplyr——数据清洗和整理

    R语言扩展包dplyr——数据清洗和整理 标签: 数据R语言数据清洗数据整理 2015-01-22 18:04 7357人阅读 评论(0) 收藏 举报  分类: R Programming(11)  ...

  9. 安装R语言的包的方法

    安装R语言的包的方法: 1. 在线安装 在R的控制台,输入类似install.packages("TSA")  # 安装 TSA install.packages("TS ...

随机推荐

  1. ViewPager+Fragment实现页面的切换

    新知识,新摘要: 效果图:framgent导入包都是v4包下,谨慎导入错误! 首先设置viewPager布局: <?xml version="1.0" encoding=&q ...

  2. [Docker] docker 基础学习笔记4(共6篇)

    离线安装nginx   apache 如何启动war包   linux 离线升级内核   nginx和Apache的使用   nginx 的负载均衡配置 是如此的简单,比weblogic的要简单100 ...

  3. [学习笔记]JS中闭包的理解

    一.闭包概念的理解 闭包,又称为词法闭包或函数闭包指引用了自由变量的函数.这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外. 自由变量:该变量既不是函数本身定义的也不是函数 ...

  4. 关于$.fn.*的使用

    这个案例是我封装了一个树形插件,也是别人写好的,但是对于我来说调用起来不是很方便,就对他的初始化方法又进行了一次封装,总的来说显得比较麻烦,不过我是新手嘛 DEMO 封装一个jcTree的方法$.fn ...

  5. Debug模式,不能进入打断点的类,反而进入代理类里

    有史以来,第一次,遇到这个问题, 设置好断点,Debug模式开启项目,,没有进入原来打好的断点类,反而,进入的是和断点类相同名字(但是图标不同)的一个类里, 不能真正的调试,调试变得很麻烦, 解决方案 ...

  6. 通过XmlHttpRequest实现带进度条异步下载文件

    本博文源自技术群的讨论,因为网上找不到实现这样效果的的代码,而我说没问题,可以实现,因此有人质疑我是否能做到,呵呵,现将我实现代码贴出如下,希望有兴趣的同学可以继续完善: 本代码仅做技术展现,请勿探讨 ...

  7. C语言fgetpos()函数:获得当前文件的读写指针(转)

    头文件:#include<stdio.h>fgetpos()函数获得当前文件的指针所指的位置,并把该指针所指的位置信息存放到pos所指的对象中.pos以内部格式存储,仅由fgetpos() ...

  8. 又一种XML的解析方法

    [Fact(DisplayName="用户名为空")] public void Should_UsernameEmpty() { var paras = new Dictionar ...

  9. 说说我的企业级应用上线历程(A little different!)

    刚到公司时,我还是一个个人应用都没上线过的小白一枚,甚至都不知道.p12文件,不知道个人应用上线所使用的证书只能是自己机子创建的发布证书才可以打包上线,不知道企业级应用如何打包,不巧的是我还赶上了 i ...

  10. 利用命令行将项目传到github上的简单操作

    (1)安装git后,打开cmd,进入要上传的文件夹中: (2)输入git init初始化本地git仓库: (3)git add .将所有文件提交到暂存区: (4)git commit -m'说明文字' ...