15: R Markdownによるレポート作成

公開

2024年7月24日

更新日

2024年8月7日

はじめに

Rを使った分析結果を利用してレポートを書く方法として、Microsoft Wordなどの文書作成アプリを使う方法もありますが、Rで作った図表を1つ1つWordに貼り付けるのはかなり面倒な作業です。

分析結果を更新する度に、図表を貼り付け直すのは面倒な作業ですし、また、最新の分析結果を貼り付けることを忘れてしまうという失敗もあり得ます。

R Markdownでは、Rmdファイル内に分析のためのRコードと、説明のための文章の両方を記述することができます。 このRmdファイルを処理することで、コードの実行結果として得られる図表が挿入された文書を出力することができます。

データの説明から分析内容(コード)と結果(図表)、結果の考察までを1つのファイルにまとめることができるため、分析の再現可能性が格段に上がります。

また、RStudioを使うと、Rmdファイルの作成から内容の記述、出力までが簡単にできてしまます。

初めてのR Markdown

簡単なRmdファイルを作って、HTMLファイルを出力してみましょう。

R Markdownファイルの新規作成

RStudioのFilesペインの「New Blank File」ボタンをクリックすると、プルダウンメニューが開きます。 上から2番目の「R Markdown…」をクリックしてください。

新しいR Markdownファイル(拡張子は.Rmd)の名前を訊かれますので、適当な名前を入力して、OKボタンをクリックしてください。

Source EditorとVisual Editor

Rmdファイルのソースを編集するには、Markdown記法1を覚える必要があるのですが、割と覚えることが多いです。 なので、初めのうちは、Visual Editorを使うとよいと思います。 Visual Editorを使うと、Wordのようにツールバーを使って書式を変更したり、表を追加したりすることが可能になり、Rmdファイルの編集が楽になります。

画面をVisual Editorに切り替えるには、エディタ左上の[Visual]ボタンをクリックします。 [Souce]ボタンをクリックすると、Source Editorに戻すこともできます(自由に行き来できます)。 どちらのEditorを利用するかは、自由です(今日の演習では、Visual Editor画面で説明します)。

Rmdファイルの構成

Rmdファイルは、大きく分けて3種類のパーツからできています。

1つはYAMLフロントマターと呼ばれる部分です。 ファイル冒頭の---で囲まれた部分に、タイトルや日付など、ファイルの基本情報や設定を記述します。

2つ目はコードチャンクと呼ばれる部分です。```で挟まれた部分に、Rのコードを記述します。

3つ目はそれら以外の部分で、本文となる文章を記述します。

YAMLフロントマター

メニューの Insert をクリックするとプルダウンメニューが開きますので、上から2つ目の「YAML Block」をクリックします。

するとRmdファイルに---で挟まれたブロックが入力されますので、------の間に、以下の内容を入力してください。

title: "適当なタイトル"
author: "あなたの氏名"
date: "今日の日付"
output: html_document

これをみるとわかるように、YAMLフロントマターには、タイトルや日付、出力形式などRmdファイルの設定情報などを書き込みます。

この時点で、htmlファイルを出力してみましょう。 そのために、まずRmdファイルを保存してください。

そして、エディタの上部にある Knit ボタンをクリックしてみましょう。 プレビューウィンドウが開いて、HTMLファイルへの出力結果が表示されていると思います。

Filesペインを開き、拡張子が.htmlのファイルができているのを確認してください。 このファイルが、Rmdファイルを元にして作成されたHTMLファイルです。

プレビューは、プレビューウィンドウではなく、Viewerペインに表示させることもできます。 エディタ上部の Knit ボタンの右にある歯車⚙️マークをクリックするとKnitの設定項目が開きますので、[Preview in Viewer Pane]を選んでください。 そして、もう一度 Knit ボタンを押すと、今度はプレビュー結果がViewerペインに表示されていると思います。

使っているPCのディスプレイサイズによっては、プレビュー結果をViewerペイン表示させることで、RmdファイルとHTMLファイルを左右に並べて見比べながら編集ができるので、作業の効率性が高まります。

便利なキーボードショートカット

Knitを実行するキーボードショートカット([Ctrl]+[Shift]+[K])は便利なので、覚えておくといいと思います。。

コードチャンク

メニューの Insert をクリックするとプルダウンメニューが開きますので、上から3つ目の「Executable Cell」▶「R」をクリックします。

すると{r}と入力されたブロックが入力されます。 このブロックにRのコードを入力することで、その実行結果である図や表を文書に表示させることができるようになります。

試しに、plot(0)を入力してみましょう。

{r}
plot(0)

Rmdファイルを保存して、Knitしてください。 下に示したような図が、HTMLファイルに追加されたでしょうか?

便利なキーボードショートカット(その2)

チャンクを挿入するキーボードショートカットは[Ctrl]+[Alt]+[I]です。 これも覚えておくと便利です。

Rmdファイル中でのコードの実行

コードチャンクの右端にある再生ボタン(▶︎)を押してみてください。 HTMLファイルに出力されたのと同じグラフが、エディタに表示されるのが確認できると思います。 このよううに、エディタ上でコードの実行を試すことができるのが、R Markdownの特徴の1つです。

チャンクラベル

チャンクにはラベルをつけることができます。 図表を出力するチャンクにはラベルをつけることをお勧めします。 以下の例では、pressureデータを利用したグラフを出力するチャンクに、plot_pressureというラベルを設定しています。

複数のチャンクに重複して同じラベルをつけることはできませんので、注意してください。

{r plot_pressure}
ggplot(pressure, aes(x = temperature, y = pressure)) +
  geom_line() + geom_point() +
  labs(x = "温度", y = "圧力")

チャンクオプション

コードチャンクの{r}の中のrの次に、チャンクオプションを追加することができます。 チャンクオプションでコードの実行結果の表示を制御することができます。 例えば、以下のようなオプションがあります。

  • include = FALSEは、コードチャンク自体と実行結果を、生成されたファイルに含まないようにします(コード自体は実行されます)。
  • echo = FALSEは、コードを表示しないようにします(実行結果は表示されます)。
  • eval = FALSEは、コードを実行しないようにします(コードは表示されます)。
  • fig.height = 7は、表示される図の高さを設定します(インチ)。
  • fig.width = 7は、表示される図の幅を設定します(インチ)。

その他に設定可能なオプションの全ては、R Markdown Reference Guideで確認してください。

特殊なコードチャンク(セットアップチャンク)

Rmdファイルの1つ目のチャンクとして、以下に示すようなセットアップチャンクを設置しておくと便利です。

knitr::opts_chunk$set()で、以降の全てのコードチャンクに適用されるチャンクオプションを指定できます。 ここでは、dev = 'ragg_png'echo = FALSEを2つを指定しています。 devはグラフィック・デバイスを指定するオプションで、ここでは図中の日本語が文字化けしないように、ragg_pngを指定しています。 また、パッケージのロードもこのチャンクで実行しています。

このセットアップチャンクのオプションにinclude=FALSEを指定しているので、このチャンク自体およびその実行結果(例えばlibrary(tidyverse)を実行したときに表示される種々のメッセージなど)は、HTMLファイルには表示されません。

{r setup, include=FALSE}
knitr::opts_chunk$set(
  dev = 'ragg_png',
  echo = FALSE
  )
library(tidyverse)
library(readxl)
library(sf)
library(gt)

コードチャンクの例

以下では、主にレポート作成中の作業を念頭に、コードチャンクにRコードを入力して図表を出力する例をいくつか示します。

例1:Excelファイルを読み込んでggplotでグラフを作る

以下のExcelファイルを読み込んで、グラフを描いてみましょう(データをダウンロードして、dataフォルダに移動してください)。

Rmdファイルに新たなコードチャンクを挿入し、以下のコードを入力してください。

{r spectators}
spectator <- 
  read_excel('data/sagan_tosu.xlsx')
spectator |> 
  mutate(average = spectators / games) |> 
  ggplot(aes(x = year, y = average, fill = league)) + 
  scale_y_continuous(labels = scales::comma) +
  geom_col() + theme_bw() +
  labs(title = 'サガン鳥栖のJリーグ平均観戦者数の推移',
       caption = 'J.LEAGUE Data Site (https://data.j-league.or.jp) より作成') +
  theme(axis.title = element_blank())

グラフの縦横比が気に入らない場合は、チャンクオプションで調節することもできます。

{r spectators, fig.height=4}

例2:Excelファイルを読み込んで表を作る

様々なデータから、Rを使って表を作成することもあると思います。 ここでは、簡単な例として、Excelファイルから読み込んだデータをそのまま表形式に表示しましょう。

Rmdファイルに新しいコードチャンクを追加いて、以下のコードを入力してください。

ここでは、gtパッケージを使って、表を作成・整形しています。 gtパッケージの使い方については、公式サイトや、私たちのRの解説などを参考にしてください。

{r residence}
residence <- 
  read_excel('data/sagan_tosu.xlsx', sheet = 'residence')
residence |> 
  gt(rowname_col = '市郡', groupname_col = '地域') |> 
  tab_stub_indent(rows = everything(),
                  indent = 5) |> 
  tab_header(title = '2019年のサガン鳥栖ホーム観戦者の居住地') |> 
  tab_footnote(footnote = '注:集計対象はホームクラブ応援者') |>
  tab_source_note(source_note = html('出所:<a href = "https://www.jleague.jp/docs/aboutj/funsurvey-2019.pdf">Jリーグスタジアム観戦者調査2019 サマリーレポート</a>'))
2019年のサガン鳥栖ホーム観戦者の居住地
比率
県内
佐賀市 22.0
鳥栖市 14.2
三養基郡 4.8
その他 23.8
県外
合計 35.2
出所:Jリーグスタジアム観戦者調査2019 サマリーレポート
注:集計対象はホームクラブ応援者

例3:GISデータを読み込んで地図を描画する

ここでは、国土数値情報から「駅別乗降客数」データをダウンロードして、地図に表示してみましょう。

S12-23_GML.zipをダウンロードして、ダウンロードフォルダで展開してください。 できたフォルダS12-23_GMLをdataフォルダに移動してください。

{r station_data}
station <- 
  st_read('data/S12-23_GML/S12-23_NumberOfPassengers.shp',
          quiet = TRUE)

sf::st_read関数で読み込んでいますが、quiet = TRUEを追加することで、HTMLファイルへの余計な出力を抑制しています。

{r st_centroid, warning=FALSE}
station <- station |> st_centroid() |> 
  rename(passenger = S12_053) |> 
  filter(!is.na(passenger), S12_002 == '九州旅客鉄道')

sf::st_centroid関数を実行すると、Warning: st_centroid assumes attributes are constant over geometriesという警告が表示されますので、チャンクオプションwarning = FALSEを追加することをお勧めします。

{r station_map}
tosu <- station |> filter(S12_001 == '鳥栖')

station <- station |> 
  mutate(distance = as.vector(st_distance(station, tosu))) |> 
  filter(distance <= 50000) |> 
  st_transform(6670)

ggplot() +
  geom_sf(aes(size = passenger), data = station, 
          color = 'blue', alpha = 0.5) +
  geom_sf(data = tosu, color = 'red') +
  labs(title = '北部九州のJR駅の乗降客数(2022年、人/日)',
       caption = '出所:国土交通省『国土数値情報(駅別乗降客数データ)』より作成') + 
  theme_bw()

図のタイトルおよびデータの出所を必ず記載するようにしてください。

本文の記述

Visual Editorを使って、本文の内容を記述する作業は、Wordに文章を書く場合と比べると、大きな違いはないと思います。

文字の装飾

太字(Bold)や斜体(Italic)下線(Underline)などの装飾が使えます。 コード(Code)は、文章内にちょっとしたコードを書く際に用います。

打ち消し線(Strikeout)もあります。また、上付き(Superscript)下付き(Subscript)も使えます。

見出し

見出し(ヘッダー)のレベルを1〜6まで設定できます。エディタ上部にある[Normal]をクリックすると[Header 1]から[Header 6]までのメニューが表示されるので、適切なものを選んでください。

見出しを設定すると、エディタ右端の[Outline]に見出し項目が表示されるようになります。

見出し番号の追加

見出しに番号を追加するには、YAMLフロントマターを書き換える必要があります。

title: "適当なタイトル"
author: "あなたの氏名"
date: "今日の日付"
output: 
  html_document:
    number_sections: TRUE
目次の表示

HTMLファイルの右側に目次を表示するには、YAMLフロントマターを書き換える必要があります。

title: "適当なタイトル"
author: "あなたの氏名"
date: "今日の日付"
output: 
  html_document:
    number_sections: TRUE
    toc: TRUE 
    toc_float: TRUE

toc_float: TRUEを追加することで、目次が画面のスクロールに追随するようになります。

Outlineの表示

エディタ右上の[Outline]をクリックすると、文章中に設定した見出し項目が一覧できるリストの形で表示されます。Outlineの見出し項目をクリックすると、当該箇所のジャンプするので、とても便利です。

もう一度[Outline]をクリックすることで、Outlineを隠すこともできます。

箇条書き

箇条書きには、記号付き箇条書き(Bulleted List)と番号付き箇条書き(Numbered List)の2種類があります。

表を挿入するには、エディタ上部にある[Insert]をクリックします。メニューが開くので、[Table…]をクリックしてください。

すると、行数(Rows)と列数(Columns)を入力するウィンドウが開きますので、希望の行数と列数を入力して、[OK]ボタンを押します。

練習として、以下のような表を作ってみましょう。

speed dist
4 2
4 10
7 4

リンクや画像の挿入

リンクを挿入するには、エディタ上部の[Link]🔗ボタンを押します。するとリンク設定するためのウィンドウが開きますので、URLやTextなど必要な情報をを入力し、[OK]ボタンを押します。

画像を挿入するには、エディタ上部の[Figure/Image]🖼️ボタンを押します。するとImageというウィンドウが開きますので、[Browse]ボタンから挿入したい画像ファイルを選択し、Captionなどの情報を必要に応じて入力した上で、[OK]ボタンを押します。

するとエディタ上に、画像が表示されますので、画像のサイズなどを適切に設定してください。

インラインコードの挿入

本文中に簡単なRのコードを挿入することができます。 r <code>のように書いたコードを、文章に埋め込みます。

例えば、以下のようなチャンクで、変数xに1〜10までのベクトルを代入したとします。

{r}
x <- 1:10

この結果を利用して、以下のような文章を書くことができます。

以上の結果から、1から10までの数字の合計は、`r sum(x)`です。

この結果をHTMLに出力すると、以下のような文字列が表示されます。

以上の結果から、1から10までの数字の合計は、55です。

脚注

  1. Markdown記法には様々な方言がありますが、RMarkdownはPandoc’s Markdownに準拠しています。↩︎