第5回講義資料

R Markdownと再現可能な研究

スライド

新しいタブで開く

Rmdファイルの作成

手順1: RStudioを起動し、プロジェクトを作成する。

手順2: File > New > R Markdown…を選択する。

手順3: OKをクリックする。

  • この段階で文書のタイトル(Title:)と作成者名(Author:)を指定することもでKるが、手順4で修正することもできるからここではOKをクリックしても良い。

手順4: タイトル情報などを以下のように修正する。

変更前

---
title: "Untitled"
output: html_document
---

変更後

---
title: "はじめてのR Markdown"
author: "関大花子"
date: "2022年 5月 12日"
output: html_document
---
自動的に日付を付けたい

date:の内容をdate: `r Sys.Date()`に修正するとKnitした日付が自動的につけられる。

手順5: ファイルを保存する。ファイル名は適宜付けること。

  • ファイルの保存はFile > Saveか、ショートカットキー(macOSだとCmd (⌘) + S、WindowsだとControl (Ctrl) + S)で出来る。

手順6: Sourceペイン上段のKnitをクリックする。

  • Knitは「ニット」と読む。

手順7: 新しいウィンドウ、またはViewerペインに出力物が表示される。

出力物が新しいウィンドウに表示されて面倒くさい

宋が推奨するRStudioの設定だと出力物がRStudioと同じ画面(Viewerペイン)に表示される。具体的にはTools > Global Options… > R Markdownへ移動し、Show output preview in:をWindowからViewer Paneに変更すれば良い。

Markdown文法の基本

 ここでは本講義の課題を遂行するための必要最低限のことのみ解説する。R Markdwonの詳細については教科書の第21章(R Markdown [基礎])を参照すること。

改行

 Markdownにおける改行はやや特殊である。特殊といっても難しいことではない。普段よりもう一行改行するだけだ。Markdownの場合、1回の改行は改行として判定されず、同じ行の連続と認識する。たとえば、Inputのように入力するとOutputのように文章1と文章2が繋がってしまう。

Input:

文章1
文章2

Output:

文章1 文章2

 文章1と文章2を改行するためにはもう一行、改行する必要がある。以下の例を見てみよう。

Input:

文章1

文章2

Output:

文章1

文章2

 こうすることで段落間の間隔を強制的に入れることとなり、作成者側にも読みやすい文書構造になるといった利点がある1

強調

 文章の一部を強調する方法として太字イタリック2アンダーラインがあり、強調ではないが、ついでに取り消し線についても紹介する。いずれも強調したい箇所を記号で囲むだけだ。

Input:

文章の一部を**太字**にしてみましょう。

*イタリック*もいいですね。

~~取り消し線~~はあまり使わないかも。

<u>アンダーライン</u>はHTMLタグを使います。

Output:

文章の一部を太字にしてみましょう。

イタリックもいいですね。

取り消し線はあまり使わないかも。

アンダーラインはHTMLタグを使います。

箇条書き

 箇条書きには順序なしと順序付きがある。順序なしの場合*または-の後に半角スペースを1つ入れるだけである。また、3文字以上の字下げで下位項目を追加することもできる。

Input:

- 項目1
   - 項目1-1
   - 項目1-2
      - 項目1-2-1
         - 項目1-2-1-1
      - 項目1-2-2
- 項目2
- 項目3

Output:

  • 項目1
    • 項目1-1
    • 項目1-2
      • 項目1-2-1
        • 項目1-2-1-1
      • 項目1-2-2
  • 項目2
  • 項目3

 順序付き箇条書きは、これは-(または*)を数字.に換えるだけである。順序なしの場合と違って数字の後にピリオド(.)が付くことに注意すること。また、順序付き箇条書きと順序なし箇条書きは組み合わせて使うことも出来る。

Input:

1. 項目1
   1. 項目1-1
   2. 項目1-2
2. 項目2
   * 項目2-1
   * 項目2-2
3. 項目3

Output:

  1. 項目1
    1. 項目1-1
    2. 項目1-2
  2. 項目2
    • 項目2-1
    • 項目2-2
  3. 項目3

見出し

 章、節、段落のタイトルを付ける際は#を使う。#の数が多いほど文字が小さくなる。章の見出しを##にするなら節は###、小節または段落は####が適切だろう。R Markdownの使用上、見出しは####まで使える。

Input:

# 見出し1
## 見出し2
### 見出し3
#### 見出し4

Output:

見出し1

見出し2

見出し3

見出し4

区切り線

 区切り線は---または***を使う。ただし、---または***の前後には必ず改行を行うこと。とりわけ、---の前に空いた行がないと、見出しとして認識されるケースがある。

Input:

---

Output:


 Markdownの表は非常にシンプルな書き方をしている。行は改行で、列は|で区切られる。ただ、表の第1行はヘッダー(変数名や列名が表示される行)扱いとなり、ヘッダーと内容の区分は|---|で行う。以下はMarkdownを利用した簡単な表の例である。ここでは可読性のために、適宜スペースを入れたが、スペースの有無は結果に影響を与えない。

Input:

|ID   |Name     |Math    |English |Favorite food|
|:---:|---------|-------:|-------:|-------------|
|1    |SONG     |15      |10      |Ramen        |
|2    |Yanai    |100     |100     |Cat food     |
|3    |Shigemura|80      |50      |Raw chicken  |
|4    |Wickham  |80      |90      |Lamb         |

Output:

ID Name Math English Favorite food
1 SONG 15 10 Ramen
2 Yanai 100 100 Cat food
3 Shigemura 80 50 Raw chicken
4 Wickham 80 90 Lamb

 1行目はヘッダーであり、太字かつ中央揃えになる。2行目以降はデフォルトでは左揃えになるが、|---|をいじることによって当該列の揃えを調整できる。|:---|は左 (デフォルト)、|---:|は右、|:---:|は中央揃えになる。また-の個数は1個以上なら問題なく、|-||---|も同じである。

画像

 R Markdownに画像を入れるには![代替テキスト](ファイル名)と入力する。画像ファイル名はパス付きを指定する必要がある。[代替テキスト]は画像を読み込めなかった場合に出力されるテキストを意味する。これは画像が読み込めなかった場合の代替テキストでもあるが、視覚障害者用のウェブブラウザーのためにも使われる。これらのウェブブラウザーはテキストのみ出力されるものが多く、画像の代わりには代替テキストが読み込まれる。また、場合によっては代替テキストが図のタイトル(キャプション)として機能する場合もある(以下の例がそうである)。この代替テキストは必須でないため![](ファイル名)でも画像の添付は出来る。

 例えば、Figsフォルダー内のfavicon.pngというファイルを読み込む場合、以下のように書く。

Input:

![『私たちのR』ロゴ](Figs/favicon.png)

Output:

リンク

 ハイパーリンクは[テキスト](URL)のように書く。[]内は実際に表示されるテキストであり、()は飛ばすURLとなる。

Input:

毎日1回は[SONGのホームページ](https://www.jaysong.net)へアクセスしましょう。

Output:

毎日1回はSONGのホームページへアクセスしましょう。

脚注

 脚注は[^固有識別子][^固有識別子]: 脚注内容の2つの要素が必要だ。まず、文末脚注を入れる箇所に[^xxxx]を挿入する。xxxxは任意の文字列で良い。しかし、同じR Markdown内においてこの識別子は被らないように注意すること(固有識別子だから)。実際の脚注の内容は[^xxxx]: 内容のように入力する。これはどこに位置しても問題ない。文書の途中でも、最後に入れても、脚注の内容は文末に位置する。ただし、脚注を入れる段落のすぐ後の方が作成する側としては読みやすいだろう。

Input:

これは普通の文章です[^foot1]

[^foot1]: これは普通の脚注です。

Output:

これは普通の文章です3

数式

 以下の内容(数式)は少なくとも本講義(ミクロ政治データ分析実習)では使わないため、飛ばしても良い。

 インライン数式は$数式$で埋め込むことができる。数式は\(\LaTeX\)の書き方とほぼ同じだ。ちなみに、R Markdownの数式はMathJaxによってレンダリングされる。このMathJaxライブラリはHTMLに埋め込まれているのではないため、インターネットに接続せずにHTMLファイルを開くと数式が正しく出力されない可能性がある。

Input:

アインシュタインと言えば、$e = mc^2$でしょう。

Output:

アインシュタインと言えば、\(e = mc^2\)でしょう。

 数式を独立した行として出力する場合は、$の代わりに$$を使用する。

Input:

独立した数式の書き方

$$
y_i \sim \text{Normal}(\mathbf{X} \boldsymbol{\beta}, \sigma).
$$

Output:

独立した数式の書き方

\[ y_i \sim \text{Normal}(\mathbf{X} \boldsymbol{\beta}, \sigma). \]

 もし数式が複数の行で構成されている場合は$$内にaligned環境(\begin{aligned}\end{aligned})を使用する。むろん、使い方は\(\LaTeX\)と同じである。

Input:

複数の行にわたる数式の書き方

$$
\begin{aligned}
  Y_i      & \sim \text{Bernoulli}(\theta_i), \\
  \theta_i & = \text{logit}^{-1}(y_i^*), \\
  y_i^*    & = \beta_0 + \beta_1 x_1 + \beta_2 z_1.
\end{aligned}
$$

Output:

複数の行にわたる数式の書き方

\[ \begin{aligned} Y_i & \sim \text{Bernoulli}(\theta_i), \\ \theta_i & = \text{logit}^{-1}(y_i^*), \\ y_i^* & = \beta_0 + \beta_1 x_1 + \beta_2 z_1. \end{aligned} \]

 ここまで見れば\(\LaTeX\)ユーザーはお分かりだろうが、$$の中には\(\LaTeX\)コマンドが使える。たとえば、行列を作成する際は以下のように\begin{bmatrix}環境を使う。

Input:

行列の書き方

$$
X = \begin{bmatrix}
  x_{11} & x_{12} \\
  x_{21} & x_{22} \\
  x_{31} & x_{32}
\end{bmatrix}.
$$

Output:

行列の書き方

\[ X = \begin{bmatrix} x_{11} & x_{12} \\ x_{21} & x_{22} \\ x_{31} & x_{32} \end{bmatrix}. \]

引用

 引用の際は文章の最初に>を入れるだけだ。>の後に半角のスペースを1つ入れること。

Input:

「政治とは何か」についてイーストンは以下のように定義しました。

> [A] political system can be designated as those interactions through which values are authoritatively allocated for a society.

Output:

「政治とは何か」についてイーストンは以下のように定義しました。

[A] political system can be designated as those interactions through which values are authoritatively allocated for a society.

コメント

 R Markdownにもコメントを付けることができる。とりあえず書いたが要らなくなった段落や文章があって、消すことがもったいない場合はコメントアウトするのも1つの方法だろう。ただし、Rのコメントアウトの方法は#だったが、これはR Markdownでは見出しの記号である。R Markdownのコメントは<!---->で囲む必要がある。

Input:

文章1

<!--
ここはコメントです。
-->

文章2

Output:

文章1

文章2


Rコード

Rコードの入れ方

 以上の内容まで抑えると、R Markdownを使って、簡単な文法のみで構造化された文書が作成できる。しかし、R Markdownの意義は文章とコード、結果が統合されることだろう。それでは文書内にRコードとその実行結果を入れる方法を紹介する。

 コードは```{r}```の間に入力するだけだ。これでコードと結果が同時に出力される。たとえば、print("Hello World!")を走らせるコードを入れてみよう。

`はどこにありますか。

これは使用するキーボードの配列によって異なる。日本語配列キーボードの場合、「@」と同じ所に位置するケースが多い。ただ、日本語配列は世界標準からかなりずれている配列を採用しており、日本語以外の配列では主に「〜」と同じ所に位置する。たとえば、宋はUNIX配列(HHKB)を使っているため、キーボードの右上に位置するが、左上に位置するケースも多い。ちなみに単一引用符('; 「シングル・クォーテーション」とも呼ばれる)とは別の記号であることに注意すること。

Input:

"Hello World!"を出力するコード

```{r, error=TRUE}
print("Hello World!")
```

Output:

“Hello World!”を出力するコード

print("Hello World!")
[1] "Hello World!"

 ```{r}```で囲まれた範囲をR Markdownではチャンク(Chunk)と呼ぶ。このチャンク内ではRと全く同じことが出来る。パッケージやデータの読み込み、オブジェクトの生成、データハンドリング、可視化など、全てが出来る。可視化の方法については第12回講義以降の講義で解説するが、ここでは例として紹介する。

Input:  

```{r}
# パッケージの読み込み
library(tidyverse)
# R内蔵データセットのirisを使った可視化
iris %>%
  mutate(Species2 = recode(Species,
                           "setosa"     = "セトナ",
                           "versicolor" = "バーシクル",
                           "virginica"  = "バージニカ")) %>%
  ggplot() +
  geom_point(aes(x = Sepal.Length, y = Sepal.Width, color = Species2)) +
  labs(x = "萼片の長さ (cm)", y = "萼片の幅 (cm)", color = "品種") +
  theme_minimal(base_size = 12)
```

Output:

# パッケージの読み込み
library(tidyverse)
# R内蔵データセットのirisを使った可視化
iris %>%
  mutate(Species2 = recode(Species,
                           "setosa"     = "セトナ",
                           "versicolor" = "バーシクル",
                           "virginica"  = "バージニカ")) %>%
  ggplot() +
  geom_point(aes(x = Sepal.Length, y = Sepal.Width, color = Species2)) +
  labs(x = "萼片の長さ (cm)", y = "萼片の幅 (cm)", color = "品種") +
  theme_minimal(base_size = 12)

インラインコード

 他にも文中にRコードを埋め込むこともできる(これをinline codeと呼ぶ)。例えば、ベクトルX <- c(2, 3, 5, 7, 12)があり、この平均値を文中で示したいとする。むろん、文中に「5.8」と書いても問題なし。しかし、実はXの入力ミスが見つかり、実はc(2, 3, 5, 7, 11)になったらどうなるだろうか。この「5.8」と書いた箇所を見つけて5.6と修正したいといけない。これは非常に面倒な作業であり、ミスも起こりやすい。文中にRコードを入れるためには`r Rコード`のように入力する。

Input:

```{r}
X <- c(2, 3, 5, 7, 11)
```

変数`X`の平均値は`r mean(X)`です。

Output:

X <- c(2, 3, 5, 7, 11)

変数Xの平均値は5.6です。

 ここで`X`だが、単に`で囲まれただけだとコードのように表示してくれるものの、そのコードは実行されない。これは主に文中に短いコードのみを入れたり、変数名、関数名を示す際に使う機能である。

コードの非表示

 既に説明した通り、R MakrdownはR + Markdownである。Rはチャンク、Markdownはチャンク外の部分に相当し、それぞれのカスタマイズができる。分析のコードと結果はチャンクにオプションを付けることで修正できる。ここではチャンクのオプションについて解説する。

 チャンクは```{r}で始まるが、実は{r}の箇所にオプションを追加することができる。具体的には{r チャンク名, オプション1, オプション2, ...}といった形だが、ここでは2つのオプションを紹介する。

 まずはコードを表示せず、結果のみを表示させる方法である。R Markdownでレポートや論文を執筆する場合、最終的に提出するものにコードは不要であろう4。R Markdownではコードと結果が同時に表示されるが、片方(あるいは両方)を非表示にすることができる。{r}の内部にecho = FALSEを指定すれば、コードは表示されず、結果のみ表示される。

Input:

```{r, echo = FALSE}
print("Rは楽しい!")
```

Output:

[1] "Rは楽しい!"

結果の非表示

 一方、{r}の内部にeval = FALSEを指定すれば、結果は表示されず、コードのみ表示される。本ページのようにマニュアルや技術書を書く際、時々使われる。

Input:

```{r, eval = FALSE}
print("Rは楽しい!")
```

Output:

print("Rは楽しい!")

 このようにコードのみ表示され、結果は表示されない。チャンクには他にも様々なオプションを付けることができる。出力される図の大きさ、位置、解像度、コードの非常時、結果の非表示、チャンク間の依存関係などが指定できるが、これらについては教科書の第21章(R Markdown [基礎])を参照すること。

 また、R Markdownでは様々な形式の文書(以外のものも)が作成可能である。たとえば、宋のホームページ5本講義の教科書6、本講義のスライド7もR Markdownで作成されたものであり、本サポートページもR Markdownに類似するQuartoで作成されている。他にも履歴書({vitae}、{pagedown}パッケージ)、ポスター・名刺({pagedown}パッケージ)、Rパッケージの開発({fusen}パッケージ)、Webアプリケーション({shiny}パッケージ)、Rのチュートリアル({learnr}パッケージ)などもR Markdownで作成可能である。


教科書

  1. HTMLに慣れている読者なら<br/>を使った改行もできる。ただし、一般的なMarkdownの改行よりも行間が狭いことには注意する必要がある。HTMLに慣れている履修者なら分かるだろうが、Markdownの改行(2行改行)はHTMLの<p></p>に相当するものである。↩︎

  2. ただし、イタリックの場合、日本語には使わないのが鉄則である。強調の意味としてイタリックを使うのはローマ字のみである。↩︎

  3. これは普通の脚注です。↩︎

  4. むろん、コードも同時に提出する必要があれば、その指示に従おう。↩︎

  5. {blogdown}パッケージ↩︎

  6. {bookdown}パッケージ↩︎

  7. {xaringan}パッケージ↩︎