最近处理数据时,一直在纠结程序的结构该如何构建,以减少很多简单又很耗时的工作。

刚好把Rob J Hyndman的blog给浏览了一遍,发现一篇2009年的文章,很有启发。

原文: Workflow in R

下面简单翻译一下:

----------------

问题最初出现在StackOverflow上。我认为其中一个回答非常有启发,值得与各位分享。

该回答建议将代码分成四个文件,存储在同一个项目文件夹中。这四个文件以如下顺序执行:

load.R

这个文件包含所有关于载入数据的代码。通常情况下,它都是一个从文件中读取数据的小文件。

clean.R

在这个文件中,对数据进行预处理,如处理缺失值,合并数据框,处理异常值。这个文件运行后,数据应该完成清洗,能够直接使用。预处理放在这里做,而不是放在原始载入数据那里,是因为这样可以完整记录你对数据做过的所有操作。

function.R

所有做实际分析时需要用到的函数都存储在这里。这个文件只做一件事情:定义数据分析时需要用到的函数(假设在载入或清洗数据,需要require自己的函数,可以将其包含在load.R或clean.R的头部)。需要特别指出的是,function.R不会对数据做任何改动。这意味着,你在修改这个文件后,不需要回头重复前面1&2步的步骤。而前两步在处理大数据集的时候,通常需要花费大量时间。

do.R

这个文件是实际做分析的代码。这个文件会使用function.R中定义的函数去计算数据,生成图形或图表等。报告或论文中所有的图表都应该在在这里编码生成。绝不要手工(即鼠标或菜单)生成图表,因为这会使图表的再生成变得麻烦。

建议以上的每个文件运行过之后,都存一次工作空间(workspace)。

这样做有许多好处。

首先,当你在后续步骤中做了更改,无需每次重载之前的数据。

其次,当你回顾一个旧的项目时,能够以一个相对快的过程去了解这个项目都做了什么事情 。

同时它也迫使你对将要做的事情有一个结构性的思考,这十分有用。

通常你会要写一段很小块的代码,不要用完就算了,也不想着去删除这些代码。这些代码要么需要特别注释,或者给它一个名称然后保存到文件中。所有的分析工作,从读取数据到产生最终的成果,应该都能够通过source()以上四个文件,反复生成,无需任何人工介入。

我将以上流程在我的几个项目上实战了一下, 发现流程有些太拘束。尤其我的do.R文件通常会变得大且笨重。

因此,我现在在使用下述流程:

main.R

这个文件只包含一些source语句,按顺序执行其他要用到的R文件。

functions.R

和上面一样,所有执行分析时需要用到的函数都放在这里。这个文件只定义分析过程中需要用到的函数,不做其他任何事情。

xxx.R

其他所有代码都被我放在形似xxx.R的文件中,由main.R按顺序依次调用。这些文件的数量和内容视项目而定。

通常会包含上面提到的load.R和clean.R文件。我通常会使用多个文件来做实际的分析工作。(而不是全都放在do.R中)

这个流程的重点是,执行main.R会将项目从头执行到尾。当数据更新,或函数改变时,这样只要source(main.R)就能一步再次执行整个分析过程。

同时保持R文件整齐、文档化是个很重要的规则。这样当你回顾你一年前写过的代码时,你才能够很快知道各部分代码是干嘛的。这意味着需要你插入注释,并删除那些没有用的代码。

[R]R的工作流的更多相关文章

  1. 把十进制整数转换为r(r=2)进制输出(顺序栈实现)

    上周的第二个作业补上~~ 上周的要求: 1.给出顺序栈的存储结构定义. 2.完成顺序栈的基本操作函数. 1)      初始化顺序栈 2)      实现入栈和出栈操作 3)      实现取栈顶元素 ...

  2. (转)\r \r\n \t 的区别

    小风吹雪 \r \r\n \t 的区别 http://www.360doc.com/content/12/0530/15/16538_214756101.shtml \n 软回车:       在Wi ...

  3. python文件操作各种模式和常用方法总结r r+ rb r+b

    1.读,r r+ rb r+b read() 全部读取 read(n) 读取一部分 r模式下:n 个字符. rb模式下:n个 字节. readline() 按行读取. readlines() 返回个列 ...

  4. (二十八)fopen与读写的标识r,r+,rb+,rt+,w+.....

    fopen与读写的标识r,r+,rb+,rt+,w+..... 函数简介 函数功能: 打开一个文件 函数原型:FILE * fopen(const char * path,const char * m ...

  5. python-基础r/R、b、u/U含义

    1.r/R,代表非转义的原始字符串,一般使用在正则表达式和win目录上 2.b“” 代表b后面的内容为bytes类型 3.u/U 表示对字符串进行unicode编码,一般使用在有中午的地方,防止乱码.

  6. 文件操作:w,w+,r,r+,a,wb,rb

    1.文件操作是什么? 操作文件: f = open("文件路径",mode="模式",encoding="编码") open() # 调用操 ...

  7. [R]R语言中的%>%和%.%

    最近在网上看R的代码,常常看到 x %>% y 的写法. 样子看着像是pipe的用法,搜了一下, 没找到语法的相关说明. 今天突然开窍,想着 %>% 可能不是语言本身支持的语法,可能是某个 ...

  8. [R]R语言里的异常处理与错误控制

    之前一直只是在写小程序脚本工具,几乎不会对异常和错误进行控制和处理. 随着脚本结构和逻辑更复杂,脚本输出结果的准确性验证困难,同时已发布脚本的维护也变得困难.所以也开始考虑引入异常处理和测试工具的事情 ...

  9. O​r​a​c​l​e​1​1​g​ ​f​o​r​ ​R​e​d​H​a​t​6​.​4​安​装​手​册

    一. 检查 Oracle 11g 安装所依赖的软件包 检查包是否安装 # rpm -q 包名 包名: 1   ) binutils 2 ) compat-libstdc++   3) elfutils ...

随机推荐

  1. gcc创建和使用静态库、动态库

    http://www.cnblogs.com/dyllove98/archive/2013/06/25/3155599.html 目录树结构: test/include/hello.h #ifdef ...

  2. 八皇后(dfs+回溯)

    重看了一下刘汝佳的白板书,上次写八皇后时并不是很懂,再写一次: 方法1:逐行放置皇后,然后递归: 代码: #include <bits/stdc++.h> #define MAXN 8 # ...

  3. MVC – 4.mvc初体验(1)

    1.MVC请求模式   2.MVC简单请求流程图 展开 折叠     3.返回string的mvc方法 展开 折叠   4.加载视图的方法  

  4. uploadify文件批量上传

    uploadify能够时间文件的批量上传,JS文件包下载地址,使用说明可以参考官网文档(http://www.uploadify.com/documentation/) 使用方法如下代码: $(&qu ...

  5. How to use the Visual Studio

    推荐一个提供VS配色方案的一个网站:StudioStyles,域名和网站同名:http://studiostyl.es/ 2. 整行剪切:Ctrl + X.光标不要选中任何文字,然后按这个快捷键就可以 ...

  6. jBox使用记录

    1.不显示底部按钮,可以将buttons设置为buttons:{} 例:$.jBox.open("iframe:http://www.baidu.com", "百度一下& ...

  7. 如何在Salesforce中进行代码开发

    两种方式: 1):用Salesforce自带的在线开发模式 Setup --> App Setup --> Develop --> than you can select 'Page ...

  8. 使用postMesssage()实现跨域iframe页面间的信息传递----转载

    由于web同源策略的限制,当页面使用跨域iframe链接时,主页面与子页面是无法交互的,这对页面间的信息传递造成了不小的麻烦,经过一系列的尝试,最后我发现有以下方法可以实现: 1. 子页面url传参 ...

  9. Android的Touch事件处理机制

    Android的Touch事件处理机制比较复杂,特别是在考虑了多点触摸以及事件拦截之后. Android的Touch事件处理分3个层面:Activity层,ViewGroup层,View层. 首先说一 ...

  10. javascript概述

    在我们进行javascript视频的时候,第一集,看到的学习要点: 1.什么是javascript?         a.一种具有面向对象能力的.解释型的程序设计语言(直接读取运行,而非编译型)   ...