当我们分析项目的时候,最好是用文件夹+Project的形式来组织内容。
从零新建R项目
如果是比较大的分析项目最好在一开始就保存为一个rproject。
-
右上角Project右侧倒三角,菜单中点击New Project可以创建新项目。
横线下面的是已经创建过的项目名,可以点击切换到其他项目。
创建新项目时需要指定一个文件夹,最好是一个新的文件夹。以后产生的R代码,图片都会默认存在这个文件夹下。
从存在文件夹创建R项目
- 打开RStudio 点击 File -> New Project....
- 选择Existing Directory
- 点击 Browse ,找到自己的项目文件夹
- 最后点击 Create Project.
R项目结构示例
一个基本的结构如下:
.
└── my_awesome_project
├── src
├── output
├── data
│ ├── raw
│ └── processed
├── reports
├── README.md
├── analysis.R
└── .gitignore
data文件夹
按需求可有这些子文件夹
- raw:对用户write-only,对R user read-only
- temp:临时数据
- output
src 文件夹
因为可能会有其他非R脚本,因此文件夹不写作R。
脚本组织方式:
- library模式:按照分析内容的不同来分成不同子文件夹(ETL,transformation,plotting)。
- 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")
Packrat project不同于R project的一点是,它有自己的库。在这个项目中安装的任何包都只针对这个project,而project外安装的所有包对这个project都不可用。
项目文件夹下多了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更适用。