RStudioって...なんだ？ Projectって...なんだ????

一説には2147483647個存在するとも言われる[RStudio](https://www.rstudio.com/)の利点のなかでも、

- Rなどのソースファイルをタブで並べて表示できる
- そのタブの順番を保持できる
- タブの内容をファイルを保存せずにRStudioを終了してしまっても、**編集途中の内容を保持**してくれている

等が全国2147483647人のRユーザーのQOLを大いに向上させたのは、おそらく異論がないことと思われます。

どうやらこれらの機能は、**Project機能**によって実現されているようです。

そもそもProjectって何だという方のために、Projectを「作成」できるコードを載せました。
`{devtools}`パッケージをインストールしていないかたは、この機会に

```r
install.packages("devtools")
```

でインストールしておいてくださいね。

# Projectの作成

忙しくない方は、以下を1行ずつ実行してみてください。

```r:Projectを作成して開く
library(devtools)
dir_path <- "../advent2016"
dir.create(dir_path)
setwd(dir_path)
template_path <- system.file("templates/template.Rproj",
                             package = "devtools")
file.copy(template_path, "advent2016.Rproj")
system("open advent2016.Rproj")
```

上記のコードがうまく実行できたあなたは、advent2016フォルダを、advent2016プロジェクトとして使える準備が整いました！　おめでとう！

デフォルトであれば右下に出ているはずのFilesのパネルに、

```r
> dir()
[1] "advent2016.Rproj"
```

というファイルができているはずです。なんか気になりますね。
ちょっと中身を覗いてみましょう。

```r:.Rprojファイルの中身を見る
> cat(readLines("advent2016.Rproj"),sep = "\n")
Version: 1.0

RestoreWorkspace: No
SaveWorkspace: No
AlwaysSaveHistory: Default

EnableCodeIndexing: Yes
UseSpacesForTab: Yes
NumSpacesForTab: 2
Encoding: UTF-8

RnwWeave: Sweave
LaTeX: pdfLaTeX

AutoAppendNewline: Yes
StripTrailingWhitespace: Yes

BuildType: Package
PackageUseDevtools: Yes
PackageInstallArgs: --no-multiarch --with-keep.source
PackageRoxygenize: rd,collate,namespace
```

この.Rprojというファイルはテキストファイルで、タブ幅とか文字コードとかの設定が書かれています。
パッケージを開発する際にも使える設定が含まれているのでやや過剰ですが、今回の用途には問題ありません。

- .RprojファイルはRStudioに紐付けられている
- ダブルクリックやopenコマンドなどで.Rprojファイルを開いた場合、RStudioが起動する
- .Rprojファイルを開くことによってRStudioが起動した場合、そのファイルが含まれるディレクトリがプロジェクトとして認識される

ということが、なんとなく伝わっていればいいなと思います。はい。
アドベントカレンダーなのでゆるくいきましょう。

# タブ自動保存のしくみにせまる

Rのソースファイルが開かれてタブが作られるとき、RStudioは一体なにをしているのか。
そういう時ってだいたい隠しファイルが何かしてますよね。見てみましょう。

```r
> dir(all.files = TRUE)
[1] "."                ".."               ".Rproj.user"      "advent2016.Rproj"
```
.Rproj.userっていう謎の何かがありますね。
`recursive = TRUE`オプションを加えて再度実行してみると、

```r
> dir(all.files = TRUE, recursive = TRUE)
[1] ".Rproj.user/A3729AE1/sdb/s-FB5E746A/lock_file"
[2] ".Rproj.user/A3729AE1/session-persistent-state"
[3] "advent2016.Rproj"                             
```

.Rproj.userは隠しフォルダだったということがわかりました。
こいつが怪しい匂いがする。

## ファイルをタブで開いてみる
次に、Rのスクリプトをタブで開いてみることにします。

と言っても、スクリプトがないので、まず作りましょう。

```r
> writeLines("1 + 1", con = "sample.R")
> dir()
[1] "advent2016.Rproj" "sample.R"        
```

なんかできてますね。
この時点で、念のため`.Rproj.user`の中身も見ておきましょう。

```r
> dir(all.files = TRUE, recursive = TRUE)
[1] ".Rproj.user/A3729AE1/sdb/s-FB5E746A/lock_file"
[2] ".Rproj.user/A3729AE1/session-persistent-state"
[3] "advent2016.Rproj"                             
[4] "sample.R"                                     
```

今つくったファイルが増えているだけのようですね。
じゃあ、そのファイルを開いてみましょう。

```r
> system("open sample.R")
```

もしうまく動かないときはFilesパネルからクリックして開いてください。がんばれ。
さて、タブが開いたら、再度隠しフォルダを見てみると、

```
> dir(all.files = TRUE, recursive = TRUE)
[1] ".Rproj.user/A3729AE1/sdb/prop/2D840BB1"       
[2] ".Rproj.user/A3729AE1/sdb/prop/INDEX"          
[3] ".Rproj.user/A3729AE1/sdb/s-FB5E746A/2CDCF209" 
[4] ".Rproj.user/A3729AE1/sdb/s-FB5E746A/lock_file"
[5] ".Rproj.user/A3729AE1/session-persistent-state"
[6] "advent2016.Rproj"                             
[7] "sample.R"  
```

なんか増えてる！
明らかに怪しいINDEXっていうファイルの中身を見てみると、

```
> URLdecode(readLines(".Rproj.user/A3729AE1/sdb/prop/INDEX"))
[1] "C:/Users/wakuteka/Repository/R/advent2016/sample.R=\"2D840BB1\""
```

先程つくったsample.Rが2D840BB1という謎のIDで管理されてそうなところまでわかりました！ばんざい！
僕はここまでで終わりにするので、興味のある方はぜひ続きを追ってみてください！


# さいごに
さて、GUIでのProject機能の作り方が知りたい人は
https://support.rstudio.com/hc/en-us/articles/200526207-Using-Projects
などを見てください。

もしくはhttp://qiita.com/advent-calendar/2016/rstudio-ide に参加してちゃんとした解説記事を書くのも大変オススメです。

Enjoy!