R tools for Visual StudioでRライブラリ開発

RTVSには、まだライブラリ開発支援機能は無いのですが、以下のように{devtools}パッケージと併用すれば、非常に簡単に開発、コミットできます。

[こわくないRパッケージ開発！2016](https://qiita.com/wakuteka/items/54f81f32baf50e243461)

## Visual StudioでのRライブラリ開発

これは、以前もTokyo.Rで紹介した記事などを見てもらえるとよいですが、Visual Studio でライブラリ開発となると、どうでしょうか？
少なくとも以下を満たすようにしたいと思います。

- devtoolsでのRライブラリのフォルダ構成と、Visual Studioプロジェクトを併存させる。
- 当該Rライブラリは、githubの管理とするが、このライブラリを利用する側のソリューションは、デバッグ等も考えて、直接このライブラリのVSプロジェクトを参照する。
- ただし、利用する側のソリューションは別のtfsやgitリポジトリ管理とする。
- そうすると、Rライブラリ側でこれによるソースの2重管理をしなくて良いようにする。

## 手順

### githubでプロジェクト作成

プロジェクト名はライブラリ名となりますので、Rのライブラリにふさわしい名前にしましょう。今回は以下のようにしました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/185de69d-0929-bb69-588f-47deb9685fb8.png)

適当なリポジトリフォルダにcloneします。
私は、ここで、Visual Studio からcloneし、通常のVSTSと同じ場所にフォルダを並べました。これで既存のVSTSソリューションからの参照もスムーズです。（フォルダが近いという意味だけですが）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/87358e82-bc10-2165-cdef-ebb2104c35c7.png)

上図のように、チームエクスプローラーの接続パネルからあらかじめ接続しておいたgithubアカウントにある当該プロジェクトを選びCloneとするだけです。Cloneすると以下のような選択画面から選べます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/48edfcf2-0dab-0c9c-28e9-6fdb3b716a97.png)

### devtoolsでフォルダを作成

devtools::setup()などで、上記のcloneしたフォルダにフォルダ構成を作成します。

上記ページにありますように、以下のような構成の状態になります。Cのコードをコンパイルするようなライブラリでなければ、シンプルです。

- R/
- DESCRIPTION
- NAMESPACE
- example.Rproj
- .Rbuildignore
- .gitignore

### Visual StudioのRプロジェクト、ソリューションファイルを移設

まず空のRプロジェクトを作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/e4c719f3-2d71-132e-6f7d-6ea45e155576.png)

この時、ソリューションフォルダを作成しない設定にしておきます。これでslnファイルとprojファイルが同じフォルダになり、無駄な階層がなくなります。gitリポジトリはもう作ってあるので、再度作らないようにします。
これで、

- ソリューションファイル
- プロジェクトファイル

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/5dc32f5c-0a94-54ea-03f2-54d4c242c5b4.png)

が出来ますが、これらを先ほどのdevtoolsで作成したRプロジェクトの空フォルダに移設します。
ここでは、以下のファイルだけを移動しました。

- [プロジェクト名].rxproj
- [プロジェクト名].rxproj.user
- [プロジェクト名].rxproj.sln
 
この場合、ソリューションファイルにもプロジェクトファイルにもまだ何も記載がないのでこれでOKだそうです。パスはすべて相対パスかエイリアスが使われているので、中身を改変する必要はありません。

### Visual Studio から開く

ここで、slnファイルをダブルクリックして、VSから開いてみます。
Rプロジェクトの場合は、プロジェクトファイルでソースを管理しておらず、フォルダ階層にあるファイルがすべて見えますので、このまま通常のRプロジェクトとして使えるようになります。これが驚き。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/29bf14a4-a373-0622-0fe1-6b12ae3abe48.png)

上記のようなプロジェクト構成ができあがっているはずです。
gitのファイルはgithubでクローンしたときのもの、slnはVisual Studioのものその他はdevtoolsで作成したものです。


### 開発する

プロジェクトファイルにRファイルをどんどん追加して、roxgenコメントなどを書いていけば、公開できるライブラリが完成です。
Cのマクロのような情報などが若干必要ですが、おおむね必要最小限で良いです。

### コミットする

githubでcloneしたのはVisual Studioでしたし、プロジェクトファイルもソリューションファイルもgithubから見たら、ただのテキストファイルなので、そのままVisual Studioを使ってコミット、PUSHしましょう。こちらは、いつも通り、チームエクスプローラーのGUIを使いましょう。Rライブラリだからとか、どうとか何も考える必要はありません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/9b4da3e2-78eb-d945-a1a0-f00ba4fa64ba.png)

なんだかこの時点で、Visual Studioの支援機構でライブラリ開発した気分になってしまいますね。


## サンプル

サンプルとしてbnlearnをmlr用にラップしたライブラリをコミットしてみました：
[mlrbn @ github](https://github.com/Masutani/mlrbn)

rxproj ファイルなどがちゃんと入っており、Visual Studio（RTVS)使いにはVSプロジェクトとしてみえ、RStudio使いにはRprojとして見えるライブラリになっています。たぶん。

別の親ソリューションからプロジェクトを参照し、使うことが可能です。例えば、internal用と、external用のソースコードを相互に編集しながら開発できます。

## 課題

なかなかいい感じにできたのですが、以下の課題があります。

- 参照元の外部ソリューションからライブラリのソースコードを編集しても、そのソリューションからはコミットできない。

これは、当然ですし、Visual Studioが一つのソリューションで2つのコミット先を使い分けできない仕様である限り、どのみち対応は難しいでしょう。ただし、以前トライしたVSTSへコミットした後、透過的にgithubへコミットする方法なら可能化もしれません。

- ライブラリのソリューション側でソースコードを改変した場合、その変更は外部ソリューションには伝わらない。

これも当たり前ですし、Rの場合コンパイルはないので、ほとんど影響ないでしょう。

- コミットのタイミングを同期できない

Visual Studioが二つのリポジトリに同期して同じコミットをするような機能が導入されない限りは無理でしょう。
そもそもライブラリにした時点で、管理は別でやるべきなので、これは期待してはいけないのかもしれません。