Rのこと。

記事は引っ越し作業中。2023年中までに引っ越しを完了させてブログは削除予定

GithubとRを連携させてレポートを共同で作成する方法

はじめに

ここではRstudioで作成したRmdファイルをGituhubで管理し、複数人で共同で作業する場合の方法について記載する。また、RstudioではUIとしてGitを管理できるようになっているが、ここではターミナル(windows:コマンドプロンプト)を使用する。

仕事であれば、本来はプライベートリポジトリを使うと思うが、ここではパブリックリポジトリを使った例になっている。

あくまでもこれは1例なので非効率、誤りあるかと思います。私も完全に使い方を理解してないので、使用される場合は自己責任でお願いします。

1. ローカルリポジトリを作成(自分)

ターミナルからcdコマンドで移動し、mkdirコマンドでフォルダを作成する。ここでは、~/Documents/Github/iris_EDARmdを管理したいとする。

$ cd ~/Documents/Github/
$ mkdir iris_EDA
$ cd iris_EDA

そして、Gitのinitコマンドでローカルリポジトリを新規に作成する。初期設定みたいなもので、.gitという隠しファイルを生成する。

$ git init
Initialized empty Git repository in ~/Documents/Github/iris_EDA/.git/

$ ls -a // 内容を確認できる
.   ..  .git

2. Githubでリモートリポジトリを作成(自分)

Githubに移動し、リモートリポジトリを作成する。ここではiris_EDAという名前のローカルリポジトリを作成。

f:id:AZUMINO:20190907143154p:plain

ターミナルに戻りリモートリポジトリを登録しておく。

git remote add origin https://github.com/<github name>/iris_EDA.git

3. Rmdを作成(自分)

Rstudioを起動し、File >> New File >> R Markdownで新規作成する。 ※Rプロジェクトでも良いと思うので、目的にあわせてください。

f:id:AZUMINO:20190907143544p:plain

Documentに必要な情報を記載し、From TemplateGithub Documentを選択しOK

f:id:AZUMINO:20190907143852p:plain f:id:AZUMINO:20190907143902p:plain

Rmdスクリプト記入し、レポートを作成。kinit >> Knit to github_documentKnitする。

f:id:AZUMINO:20190907144035p:plain  f:id:AZUMINO:20190907144916p:plain

Rmdファイルを名前(iris_EDA)をつけて、さきほど作成したローカルリポジトリに保存する。

4. リモートリポジトリにプッシュ(自分)

Rmdをリモートリポジトリにプッシュしていく。Gitではリモートリポジトリにプッシュする際に、git add >> git commit >> git pushという手順をとる。git addはステージに変更を記録するコマンドで、git commitはローカルリポジトリに変更を記録するコマンド、git pushはリモートリポジトリに変更を記録するコマンドである。

現在の状況として、RStudio上でKnitしたので、iris_EDAフォルダには、.mdと画像データなどが保存されているiris_EDA_filesフォルダが格納されている。ちなみに.mdGithubないしブラウザ上で開くことでレポートを確認できる。

$ ls
iris_EDA.Rmd    iris_EDA.md iris_EDA_files

ではgit add >> git commit >> git pushしていく。

$ git add . // フォルダのすべてが対象

$ git commit -m "first commit" //-mオブションでコミットメッセージを作成
[master 84c0106] first commit
 3 files changed, 66 insertions(+)
 create mode 100644 iris_EDA.md
 create mode 100644 iris_EDA_files/figure-gfm/unnamed-chunk-2-1.png
 create mode 100644 iris_EDA_files/figure-gfm/unnamed-chunk-3-1.png

$ git push origin master // リモートポジトリにプッシュ
Counting objects: 7, done.
[略]
Fast-forward
 iris_EDA.Rmd                                       |  20 +++--
 iris_EDA.md                                        |  86 +++++++++++++++------
 .../figure-markdown_github/unnamed-chunk-3-1.png   | Bin 0 -> 5749 bytes
 .../figure-markdown_github/unnamed-chunk-4-1.png   | Bin 0 -> 9402 bytes
 4 files changed, 74 insertions(+), 32 deletions(-)
 create mode 100644 iris_EDA_files/figure-markdown_github/unnamed-chunk-3-1.png
 create mode 100644 iris_EDA_files/figure-markdown_github/unnamed-chunk-4-1.png

.mdGithubないしブラウザ上で開くとこんな感じ。

f:id:AZUMINO:20190907145136p:plain

共同作業者に修正を依頼(自分)

作成したレポートの変数や引数が間違っていたので、共同作業者に修正を依頼する場面を考える。まず、Gituhub上で、Settings >> Collaboratorsと進み、枠内に<Github name of Collaborators>を記入し、コラボレートのリクエストを送り、共同作業者にはメールが届くので、そこから認証してもらう。

f:id:AZUMINO:20190907153544p:plain

共同作業者はリクエストを認証し、作業を進めていく。

4.5. 変更に関するコマンド(自分)

git add >> git commit >> git pushという流れでリモートリポジトリへ変更を記録していくが、その過程で変更を取り消したりしたい場合がある。その時は状態に応じて、下記のコマンドで修正していく。

4.5.1 git checkout -- <file name>

git addしたけれども、ワークツリーのデータへの変更をまるごと取り消したいときは、git checkout -- <file name>を実行することで、ステージからも取り消され、ワークツリーのファイル自体も以前のバージョンに戻すことが可能。

// 必要に応じて下記は実行する
$ git add . // フォルダのすべてが対象
$ git checkout -- <file name> // ワークツリーの変更を前の状態に戻す

4.5.2 git reset HEAD <file name>

また、git addしたけれども、さきほどとは異なりステージへの変更を取り消したいときは、git reset HEAD <file name>を実行することで、ステージへの変更を取り消すことが可能。この場合、ワークツリーのファイル自体の変更はそのまま。

// 必要に応じて下記は実行する
$ git add . // フォルダのすべてが対象
$ git reset HEAD <file name> // ステージの変更を取り消す。つまり、アンステージする。

4.5.3 git commit --amend

git commitしたけれども、ローカルリポジトリへの変更を再度、変更したいと思ったときは、git commit --amendを実行することで、ローカルリポジトリへコミットした内容の変更を取り消すことが可能。

手順としては、まずはファイルを修正し、git addでステージに追加し、git commit --amendでローカルリポジトリへコミットしたコミット内容を修正する。

// 必要に応じて下記は実行する
// まずはファイルを修正する
$ git add . // フォルダのすべてが対象
$ git commit --amend // コミットの変更を取り消す。

5. ローカルリポジトリを作成(共同作業者)

共同作業者は、ターミナルからcdコマンドで移動し、ここでは~/Documents/iris_EDAディレクトリでRmdを管理したいとする。まずはDocumentsに移動しgit clone <remote repo url>でクローンする。

f:id:AZUMINO:20190907153544p:plain

$ cd ~/Documents

$ git clone https://github.com/<github name>/iris_EDA.git
Cloning into 'iris_EDA'...
remote: Enumerating objects: 10, done.
remote: Counting objects: 100% (10/10), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 10 (delta 0), reused 10 (delta 0), pack-reused 0
Unpacking objects: 100% (10/10), done.

iris_EDAディレクトリに移動し、git branchコマンドでmod_plotブランチを作成し、git checkoutコマンドでブランチに移動する。

$ cd iris_EDA
$ git branch mod_plot
$ git checkout mod_plot

そして、RStudio上で~/Documents/iris_EDA/iris_EDA.Rmdを開き、修正の依頼に従って修正する。

  • Sepal.LengthPetal.Lengthの関係を記述していた部分をSepal.WidthPetal.Lengthの関係に変更
  • geom_smooth(method = 'lm')からgeom_smooth(method = 'loess')に変更
  • library(tidyverse)を追加

変更が完了すれば、RStudio上でkinit >> Knit to github_documentKnitし、Rmdを保存する。

6. プルリクエストの作成(共同作業者)

修正が終われば、ターミナルに移動し、git add >> git commit >> git pushでブランチをリモートリポジトリへプッシュし、プルリクエストを作成する。

$ git add .
$ git commit -m "first commit"
[mod_branch 130ef1f] modify vals and plot
 4 files changed, 74 insertions(+), 32 deletions(-)
 create mode 100644 iris_EDA_files/figure-markdown_github/unnamed-chunk-3-1.png
 create mode 100644 iris_EDA_files/figure-markdown_github/unnamed-chunk-4-1.png

$ git push origin mod_plot
Enumerating objects: 12, done.
Counting objects: 100% (12/12), done.
[略]
To https://github.com/<github name>/iris_EDA.git
 * [new branch]      mod_branch -> mod_branch

Githubに移動し、プルリクエストを作成する。緑ボタンのCompare & pull requestから作成する。

f:id:AZUMINO:20190907151139p:plain f:id:AZUMINO:20190907151338p:plain

コメントの入力やレビュワーを設定し、Create pull requestを押せば、プルリクエストの完成。レビュアーにプルリクエストの連絡がメールで届く。

7. 修正内容をマージ(自分)

共同作業者から修正作業完了の報告を受け取ったら、Githubに移動し、内容をレビューし、マージする。共同作業者のプルリクエストが表示されているので、クリックして内容を確認する。

f:id:AZUMINO:20190907151537p:plain

再度修正を依頼する場合はここで依頼の設定を行う。特に問題なければ、コメントなどしつつMerge pull requestを選択。

f:id:AZUMINO:20190907151832p:plain

Confirm mergeを選択。

f:id:AZUMINO:20190907152020p:plain

これでマージされるので、マージ後の内容を確認する。.mdを開くとこんな感じ。

f:id:AZUMINO:20190907152229p:plain

ターミナルに戻り、git pullコマンドでプルして、ローカルリポジトリを最新の状態に変更する。

$ git pull origin master
remote: Enumerating objects: 13, done.
[略]
Fast-forward
 iris_EDA.Rmd                                       |  20 +++--
 iris_EDA.md                                        |  86 +++++++++++++++------
 .../figure-markdown_github/unnamed-chunk-3-1.png   | Bin 0 -> 5749 bytes
 .../figure-markdown_github/unnamed-chunk-4-1.png   | Bin 0 -> 9402 bytes
 4 files changed, 74 insertions(+), 32 deletions(-)
 create mode 100644 iris_EDA_files/figure-markdown_github/unnamed-chunk-3-1.png
 create mode 100644 iris_EDA_files/figure-markdown_github/unnamed-chunk-4-1.pn

$ ls -a
.       .git        iris_EDA.md
..      iris_EDA.Rmd    iris_EDA_files

8. 不要なブランチを削除(共同作業者)

共同作業者は、マージが終われば、不要なブランチは削除する。

ターミナルからgit checkoutコマンドでマスターブランチに移動し、git branch -D <branch name>コマンドでブランチを削除する。

$ git checkout master
$ git branch -D mod_branch
Deleted branch mod_branch (was 130ef1f).

これで作成から修正のマージまでの手順はおしまい。GitとRStudioを連携させて作業させたい方は、@uriさんのRStudioではじめるGitによるバージョン管理を見てください。非常にわかりやすいです。作業していて毎回思いますが、RStuido上でできるっていいですよね。(なんでこの記事を書いたのか…笑)