R和独奏数据分析师的版本控制

我尊重的许多数据分析师使用版本控制。 例如:

  • http://github.com/hadley/
  • 在http://permut.wordpress.com/2010/04/21/revision-control-statistics-bleg/上查看评论

不过,我正在评估采用git等版本控制系统是否值得。

简要概述:我是一位使用R来分析研究出版物数据的社会科学家。 我目前不生产R软件包。 我的一个项目的R代码通常包含几千行代码,用于数据input,清理,操作,分析和输出生成。 出版物通常使用LaTeX编写。

关于版本控制,我已经阅读了很多好处,但是他们似乎与独奏数据分析师不太相关。

  • 备份:我已经有一个备份系统。
  • 分叉和倒带:我从来没有觉得有必要这样做,但我可以看到它是如何有用的(例如,你正在准备多个基于相同数据集的期刊文章,你正在准备一个每月更新的报告等)
  • 合作:大部分时间我都是自己分析数据,因此,我不会得到版本控制的协作好处。

采用版本控制还有几个潜在的成本:

  • 有时间去评估和学习一个版本控制系统
  • 可能会增加我当前文件pipe理系统的复杂性

不过,我仍然有这样的感觉,我错过了一些东西。 有关版本控制的一般指南似乎比数据分析师更多地针对计算机科学家。

因此,特别在类似于上述情况的数据分析人员方面:

  1. 版本控制是值得的吗?
  2. 采用版本控制的主要优点和缺点是什么?
  3. 开始使用R进行数据分析的版本控制(例如,示例,工作stream程概念,软件,指南链接)是一个很好的策略?

我觉得你的问题的答案是肯定的 – 使用版本控制系统pipe理你的文件的好处远远大于实现这样一个系统的成本。

我会尽力详细回应你提出的一些观点:

  • 备份:我已经有一个备份系统。

是的,我也是如此。但是,依靠通用备份系统来适当地跟踪与您的工作有关的重要和活跃的文件,还有一些问题需要考虑。 在performance方面:

  • 您的备份系统在什么时间间隔拍摄快照?
  • build立快照需要多长时间?
  • 在拍摄快照时是否需要镜像整个硬盘?还是只能备份刚收到重要更新的两个文件?
  • 您的备份系统可以精确地显示您的文本文件从一个备份到另一个备份的变化吗?

最重要的是:

  • 备份保存了多less个位置? 他们和你的电脑在同一个物理位置吗?
  • 从备份系统恢复给定版本的单个文件有多容易?

例如,有一台Mac,并使用Time Machine备份到我的电脑中的另一个硬盘。 时间机器是伟大的恢复奇怪的文件或恢复我的系统,如果事情搞砸了。 然而它根本没有什么需要信任我的重要工作:

  • 备份时,Time Machine必须对整个硬盘进行镜像,这需要花费相当长的时间。 如果我继续工作,则无法保证我的文件将在我启动备份的状态下被捕获。 在第一次备份结束之前,我还可能达到另一个要保存的点。

  • 我的Time Machine备份所保存的硬盘驱动器位于我的机器中,这使我的数据容易遭受盗窃,火灾和其他灾难。

有了像Git这样的版本控制系统,我可以毫不费力地启动特定文件的备份,请求在文本编辑器中进行保存,并且文件被瞬间成像并存储。 而且,Git是分布式的,所以我工作的每台计算机都有一个完整的版本库。

这相当于让我的作品反映在四台不同的计算机上 – 没有什么上帝的行为可能会破坏我的文件和数据,在这一点上,我可能不会太在意。

  • 分叉和倒带:我从来没有觉得有必要这样做,但我可以看到它是如何有用的(例如,你正在准备多个基于相同数据集的期刊文章,你正在准备一个每月更新的报告等)

作为一个独奏者,我也没有多less分叉。 但是,通过倒带选项节省的时间已经多次回报了我对学习版本控制系统的投资。 你说你从来没有觉得有必要这样做,但是在你当前的备份系统下重放任何文件真的是一个无痛,可行的select?

有时候,报告在一两个小时前的45分钟内看起来更好。

  • 合作:大部分时间我都是自己分析数据,因此,我不会得到版本控制的协作好处。

是的,但是如果你最终在一个项目上与他人合作,你会学到一个可能certificate是不可或缺的工具。

  • 有时间去评估和学习一个版本控制系统

不要太担心这个。 版本控制系统就像程序devise语言 – 它们有一些关键的概念需要学习,其余的只是语法上的糖。 基本上,你学习的第一个版本控制系统需要投入大部分时间转换到另一个版本控制系统,只需要学习新系统如何expression关键概念。

select一个受欢迎的系统,去为它!

  • 可能会增加我当前文件pipe理系统的复杂性

您是否有一个文件夹,说包含与您的数据分析活动相关的所有文件夹和文件的Projects ? 如果是这样,那么掌握版本控制将会增加您的文件系统的复杂性0 。 如果您的项目散布在您的计算机上,那么在应用版本控制之前,您应该将它们集中起来,这将最终降低pipe理文件的复杂性 – 这就是为什么我们有一个Documents文件夹。

  1. 版本控制是值得的吗?

是! 它给你一个巨大的撤销button,并允许您轻松地将工作从机器转移到机器,而不用担心丢失USB驱动器等事情。

2采用版本控制的主要优点和缺点是什么?

唯一我能想到的是文件大小略有增加 – 但现代版本控制系统可以通过压缩和select性保存来完成绝对令人惊奇的事情,所以这非常不切实际。

3开始使用R进行数据分析的版本控制(例如,示例,工作stream程的想法,软件,指南的链接)的好策略是什么?

保持在版本控制下生成数据或报告的文件是有select的。 如果您正在使用Sweave东西,请.Rnw您的.Rnw文件,而不是从它们生成的.tex文件。 存储原始数据,如果这将是一个痛苦重新获得。 如果可能的话,编写并存储一个获取数据的脚本,另一个清理或修改数据,而不是存储对原始数据的更改。

至于学习版本控制系统,我强烈推荐Git和本指南 。

这些网站也有一些与Git执行特定操作有关的很好的提示和技巧:

我在一家分析工作室工作了九年,并向我们的分析项目介绍了版本控制的概念。 显然,我是版本控制的一个信徒。 不过,我会提出以下几点。

  1. 如果您正在分析可能在法庭上使用,版本控制可能不合适。 这听起来不像是适用于你的,但是它会让我们的客户非常紧张,知道我们制作的每个脚本的每一个版本都可能被发现。 我们对代码模块使用了版本控制,这些代码模块在多次参与中被重复使用,但是由于这个原因没有使用特定于版本控制的代码。
  2. 我们发现版本控制最大的好处来自于存储在多个项目中重复使用的代码模块。 例如,您可能有一个特别喜欢的方式来处理某些人口普查PUMS提取物。 将此代码组织到一个目录中,并将其放入您的VCS中。 您可以在每次需要时检查每个新项目。 如果您正在对该项目的特定常用数据集进行特殊处理,那么为特定项目创build特定代码的特定分支甚至可能是有用的。 然后,当你完成这个项目时,决定你的特殊代码多less合并回主分支。
  3. 不要将处理的数据放入版本控制。 只有代码。 我们的目标是始终拥有一套完整的脚本,以便我们可以删除所有内部处理的数据,按下一个button,并从头开始重新生成报告的每个编号。 这是唯一可以确保你的数据中没有神秘生活的老bug。
  4. 为了确保您的结果是完全可重复的,仅将代码保存在VCS中是不够的。 仔细追踪哪些模块用于创build任何特定交付物的版本是非常重要的。
  5. 至于软件,我对Subversion有好运。 这很容易build立和pipe理。 我认识到像git和mercurial这样的新型分布式VCS的吸引力,但是如果你自己工作,我不确定是否有强大的优势。 另一方面,我也不知道使用它们有什么不利之处 – 我只是没有在分析环境中与他们合作过。

我使用R和LaTeX做经济学研究,而且我总是把我的工作放在版本控制之下。 这就像无限的撤消。 尝试Bazaar,这是最简单的学习和使用之一,如果你在Windows上,它有一个graphics用户界面(TortoiseBZR)。

是的,在与他人合作时,版本控制还有其他好处,但是即使是在单独的项目中,也是很有意义的。

为了完整起见,我想我会提供一个关于版本控制的更新。

我发现单独的数据分析项目的版本控制是非常有用的。

我采用了git作为我的主要版本控制工具。 我首先使用StatET在Eclipse中使用Egit。 现在我一般只使用命令行界面,尽pipe与RStudio的集成相当不错。

我已经从数据分析项目的angular度博客了解我的经验,从版本控制进行设置 。

正如后文所述,我发现采用版本控制在我如何思考数据分析项目方面有许多次要的好处,包括澄清:

  • 源文件和派生文件之间的区别
  • 依赖关系的性质:
    • 代码元素之间的依赖关系
    • 项目内文件之间的依赖关系
    • 以及与存储库外部的文件和程序的依赖关系
  • 存储库的性质以及存储库应该如何划分
  • 承诺和logging变更和项目里程碑的性质

现在,您可能会认为您的工作是开发可以完成您想要的任务的代码。 在采用修订控制系统之后,您会认为自己的工作是在存储库中写下您的遗产,并对其进行明显的增量更改。 感觉好多了。

我仍然会推荐像你这样的独奏行为的版本控制,因为有一个安全网来抓错误是一件好事。

我曾经是一名独立的Java开发人员,而且我仍然使用源代码pipe理。 如果我不断地检查事情,如果出现问题,我不能失去一个多小时的工作。 我可以尝试和重构而不用担心,因为如果出现错误,我总是可以回滚到我最后的工作版本。

如果这是你的情况,我build议使用源代码pipe理。 这并不难学。

您必须使用版本控制软件,否则您的分析将不会完全重现。

如果您想在某处公布您的结果,则应该始终能够在制作脚本时重新构build脚本的状态。 假设某位评论者在其中一个脚本中发现错误:您如何知道哪些结果受到影响,哪些不受影响?

从这个意义上讲,备份系统是不够的,因为它可能每天只做一次,而且不会将标签应用于不同的备份,所以您不知道哪个版本对应于哪个结果。 学习一个vcs比你想象的简单,如果学习如何添加一个文件以及如何提交更改已经足够了。

退后一步,了解编写R包的优点! 你说你有几千行代码的项目,但是这些结构或文件不像包装代码是? 你可以通过遵循包的理想获得巨大的胜利,包括每个函数的文档,testing许多常见的难以捕捉的错误,编写自己的testing套件的工具等等。

如果你还没有制定一个包的纪律,那么我不确定你是否有纪律去做适当的修改控制。

版本控制是值得的吗?

一个大的是。

采用版本控制的主要优点和缺点是什么?

优点:你可以跟踪你之前做过的事情。 对乳胶特别有用,因为您可能需要一个被删除的旧段落! 当你电脑死机或者你正在使用新的时候,你的数据就会重新出现。

缺点:你需要做一些设置。

开始使用R进行数据分析的版本控制(例如,示例,工作stream程概念,软件,指南链接)是一个很好的策略?

刚开始使用它。 我在Windows上使用龟SVN作为客户端工具,我的部门有一个svn服务器,我把所有的代码和数据(是的,你也把你的数据放在那里)。

我同意上面的观点,并说,是的,版本控制是有用的。

优点;

  • 保持您的研究logging以及备份,(标记)
  • 它可以让你尝试不同的想法,如果他们不工作(分支)
  • 你可以与其他人分享你的工作,他们可以与你分享他们的变化(我知道你没有指定这个,但它是伟大的)
  • 大多数版本控制系统都可以轻松地为所有受控文件创build一个压缩包,例如在您提交文章发布的位置,这可以帮助其他人审阅您的文章。 (你可以手动做到这一点,但是为什么在版本控制时做这些过程呢)

在工具集方面,我使用Git ,以及StatEt和Eclipse ,虽然你不必使用Eclipse, Eclipse有几个Git插件 ,但我通常使用命令行选项。

独奏开发(任何种类)的版本控制是非常有趣的:

  • 探索历史,并将目前的工作与过去的工作进行比较
  • 分支并为同一组文件尝试不同的版本

如果您没有看到自己正在执行这两种基本的版本控制function中的一种,则可能只需要一个简单的备份工具即可。
如果你确实需要这些function,那么你也会得到备份(例如git bundle

我也做单独的脚本工作,我发现它使事情更简单,而不是使它们更复杂。 备份集成到编码工作stream程中,不需要单独的一套文件系统过程。 学习任何版本控制系统的基本知识所花费的时间肯定会花费很多时间。

Dropbox有一个“ppor man's”版本控制function,可以让您轻松完成部分任务,并带来许多额外的好处。