R基础 | 学会使用R project及R项目结构示例

当我们分析项目的时候,最好是用文件夹+Project的形式来组织内容。

从零新建R项目

如果是比较大的分析项目最好在一开始就保存为一个rproject。

  1. 右上角Project右侧倒三角,菜单中点击New Project可以创建新项目。


    image.png

    横线下面的是已经创建过的项目名,可以点击切换到其他项目。

  2. 创建新项目时需要指定一个文件夹,最好是一个新的文件夹。以后产生的R代码,图片都会默认存在这个文件夹下。

从存在文件夹创建R项目

  1. 打开RStudio 点击 File -> New Project....
  2. 选择Existing Directory
  3. 点击 Browse ,找到自己的项目文件夹
  4. 最后点击 Create Project.

R项目结构示例

一个基本的结构如下:

.
└── my_awesome_project
    ├── src
    ├── output
    ├── data
    │   ├── raw
    │   └── processed
    ├── reports
    ├── README.md
    ├── analysis.R 
    └── .gitignore
image.png

data文件夹

按需求可有这些子文件夹

  • raw:对用户write-only,对R user read-only
  • temp:临时数据
  • output

src 文件夹

因为可能会有其他非R脚本,因此文件夹不写作R。
脚本组织方式:

  1. library模式:按照分析内容的不同来分成不同子文件夹(ETL,transformation,plotting)。
  2. pipeline模式:有一个主要的runner script,将所有脚本按顺序执行。
    无论哪种方式,都要将函数定义和应用分开。也就是说,只有pipeline或runner scripts用来执行函数,其他的都是定义函数的。
    另外脚本的组织可以视项目大小定。
  • 所有函数定义脚本放在src的子文件夹中(按用途分类命名文件夹,比如src/data_engineering)。将直接执行的脚本直接放在src下。适合较大的项目。
  • 将函数定义脚本放在src下,而执行脚本analysis.R放在根目录。适合小的项目。执行脚本可能像下面这样:
library(some_package)
library(some_other_package)
source("R/functions.R")
source("R/utilities.R")

output文件夹

一般把输出图放在output/plots下面。

reports文件夹

报告pdf放在reports/下面,reporting code放在src下面。

requirements and general settings

如果只是用某个包中的某个函数,不需要library整个包。package::function(arg1, arg2, ...)就可以了。
可以有一个requirements.R, 在所有脚本前执行。这个脚本中放一些基础设置,比如locale。还有CRAN install check。但更建议用Packrat。

## This is our requirements.R script
## TODO : include an `InstalledPackage` fallback
require(googleAnalyticsR)
require(lubridate)
require(dataframes2xls)
require(ggthemr)
require(plyr)
require(dplyr) # need to load plyr before dplyr & not the other way!
require(tidyr)
require(stringr)
# require(bigQueryR)
require(janitor)

packrat

与别人分享代码的时候,常常由于每个人机器上的R版本以及安装的R包的版本不一致,导致程序无法运行,常常看到的错误信息是,你所运行的R包不支持3.X.X版本。将自己项目使用的包打包,这样别人就可以顺利的复现自己的结果了。
packrat的优点:

  • 独立:为一个项目安装新的或不同版本的包不会影响其他的项目。它让每一个项目都有自己独立的包库。
  • 便携:可以方便的将自己的项目从一台电脑转移到另一台电脑,甚至跨平台。
  • 可重复:它记录你需要的每一个包的版本,并保证无论到哪里你都安装的是同样版本的包。
    install.packages("packrat")
    使用packrat要从创建项目初始开始。先新建项目文件夹。然后将这个文件夹初始化为packrat文件夹。
    packrat::init("~/projects/packrat_try")
    image.png

    Packrat project不同于R project的一点是,它有自己的库。在这个项目中安装的任何包都只针对这个project,而project外安装的所有包对这个project都不可用。
    image.png

    项目文件夹下多了packrat文件夹。里面主要存储安装包的信息。

checkpoint

checkpoint可以

  • 创建一个快照文件夹~/.checkpoint用来存包。
  • 扫描我们的项目文件夹,通过library() and require()来确定我们用了哪些包
  • 从MRAN 安装包install.packages()到我们自己的快照文件夹
  • 将我们的CRAN镜像指向MRAN (修改options(repos))

创建和使用的代码是一样的。快照信息存在~/.checkpoint

library(checkpoint)
checkpoint("2015-04-26")

这两行代码放在自己的脚本的最上面。

两个包的区别

checkpoint基于server端,因此负担不在用户这里,而在服务器上。服务器每天会记录当天R所有包的版本号。代码创建者只需要记录快照日期,而使用者通过快照日期就可以安装和创建者版本一致的R包。

Packrat需要用户远程数据同步自己的Packrat文件和代码给另一个用户。 这是一个很繁重的过程。 但对于包的版本不是更新到同一天,或者有些包不在CRAN上面(github),那么packrat更适用。

参考

  1. R项目示例
  2. Beyond Basic R – Introduction and Best Practices
  3. Using-Projects
  4. structuring-r-projects/
  5. a-truly-reproducible-r-workflow
  6. checkpoint
    )
  7. packrat
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容