はじめに

初めてのブログ投稿です。

この記事はR Advent Calendar 2017 24日目の記事になります。 クリスマスイブはRで楽しく過ごしましょう。

今日と明日の夜に予定がない方は一緒にRmarkdownでポスターを書きましょう。

Rmarkdownとは

markdwon記法の中でRが使えるマークアップ言語です。 RstudioでNew Fileの際に適宜選択をするとサンプルが表示され、htmlやPDF, webスライドなどが簡単に書けます。

Rmarkdownで文章を書くときに強調される利点の1つは再現性です。 何か指摘を受けた時にすぐに修正ができたり、時間が経ってからでも分析方法がすぐ思い出せたりといいことづくめです。 ポスター発表はその研究についてコメントをもらったり、議論したりすることが目的の場合も多いと思います。 そのコメントを元に分析方法やデータを修正する場合に、Rmarkdownなら何の迷いもなく行うことができます。

Rmarkdownについては、このサイトこの本に詳しいです。

BeamerPoster

PDFを生成する際には裏で LaTeX を利用しています。 LaTeXを利用しているためBeamerでスライドを作れるのは当然ですが、markdown記法で簡単に書くことができます。 (markdown記法で書く場合にはBeamerの機能に若干の制約があります。) Beamerが可愛くて、Rmarkdownも可愛いと思うような人にはとても楽しい時代になりました。 Beamerを使えるということはBeamerposterも使えるはずなので、ポスターまでRmarkdownで作れるはずです。

というわけで先日行ってきた学会ではRmarkdownを使ってポスターを作成し、ポスター発表をしてきました。 そこで覚えたちょっとした設定を忘れないように書いておきたいと思います。

BeamerPosterではBeamerのきれいなスタイルをポスターでも使うことができます。 ただ、ポスターをより自分好みにしたいと思うとスタイルファイルなどをいじる必要があります。 今回は東北大学 住井研究室のサンプル が綺麗だったので、スタイルファイルなどはこちらからお借りして、少し自分好みに直して使っています。

実際に書いてみる

Rmdファイルの作成

上で紹介したスタイルファイルを使って実際にポスターを書いてみましょう。

まずは、Rstudio上などで任意の.Rmdファイルを作成しましょう。 File -> New File -> Rmarkdwon -> Presentation -> PDF(Beamer)を選択しましょう。

---
title: "Untitled"
author: "name"
date: "2017年12月24日"
output: beamer_presentation
---

Rmdファイルができると上記のようなyamlが表示されていると思います。 これを以下のように変更します。

---
header-includes:
      - \usepackage[orientation=portrait,size=a0]{beamerposter} #beamerposterを利用してa0縦のポスターを作成
      - \title{ポスターのタイトル} #タイトル
      - \author{著者名} #著者
      - \institute{所属} #所属
      - \usepackage{luatexja} #日本語の文章を作成
      - \usepackage[ipaex]{luatexja-preset} #フォントはipaexを使用
      - \renewcommand{\kanjifamilydefault}{\gtdefault} #明朝体はゴシック体に
      - \usetheme{sumiilab-poster} #東北大学 住井研究室のスタイルを少し修正して拝借
      - \beamertemplatenavigationsymbolsempty #東北大学 住井研究室のスタイルを少し修正して拝借
      - \renewcommand{\figurename}{図} #図のキャプションをfigureから図に
      - \renewcommand{\tablename}{表} #表のキャプションをtableから表
      - \def\bcols{\begin{columns}} #LaTeX環境の中でマークダウンが使えるようにおまじない
      - \def\bcol{\begin{column}}
      - \def\ecol{\end{column}}
      - \def\ecols{\end{columns}}
      - \def\bblck{\begin{block}}
      - \def\eblck{\end{block}}
output:
  beamer_presentation:
    latex_engine: lualatex
    keep_tex: true
    slide_level: 3
bibliography: iris.bib #引用する書誌情報をまとめたファイル
biblio-style: apsr #引用する書誌情報のスタイル
---

Posterの作成

今日のブログで一番大切なことはheader-includesの1行目です。 \usepackage[orientation=portrait,size=a0]{beamerposter}と記載します。 orientation=portraitで縦書きに、 orientation=landscapeで横書きになります。 sizeで紙のサイズを指定します。 これを指定すれば、RmarkdownからBeamerPosterを利用してポスターを書くことができます。

後は細かいTipsを少し書いていきます。 通常、titleやauthorはheader-includesより上に独立して書いていると思いますが、今回は使用するスタイルファイルで上部に書くように設定をしているので、その仕様に合わせるためにheader-includesの中に- \title{ポスターのタイトル}として記載します。authorやinstituteも同じです。

LaTeXの環境内でmarkdown記法を使う

- \def\bcols{\begin{columns}} #LaTeX環境の中でマークダウンが使えるようにおまじない
- \def\bcol{\begin{column}}
- \def\ecol{\end{column}}
- \def\ecols{\end{columns}}
- \def\bblck{\begin{block}}
- \def\eblck{\end{block}}

次に大切なのはこのブロックでしょうか。 2段組みで書きたかったので、LaTeXでいうところの\begin{columns},\end{columns}を使います。 しかし、シンプルにRmdの中にbegin,endを利用して書くとその環境内ではmarkdown記法が使えなくなってしまいます。 LaTeXの環境の中でもmarkdown記法を使えるようにするためにコマンドを定義し直してあげるとmarkdown記法が使えるようになります。 なぜなのかはわかりません。 わかる人がいたらぜひ教えてください。

header-includeを別ファイルにして読み込む

なお、header-includeは別ファイルにして、読み込むということもできます。 その方がyamlの可読性は上がりそうですが、別のファイルを開かないとtexの設定をいじれないので、好みが別れそうです。 普段はheader.texなどとして、includes: in_header: header.texとして読み込んでいます。

ちなみにincludes: in_header:***.texを読み込んだ場合は、header-includes:を併用できません。 includes: in_header:header-includes:のどちらかを使うようにしましょう。

bibファイルと引用スタイルの指定

bibliography: iris.bib #引用する書誌情報をまとめたファイル
biblio-style: apsr #引用する書誌情報のスタイル

ここでは引用する書誌情報をまとめたbibファイルと記載する際のスタイル情報を指定しています。 ポスターで引用することはあまり多くないと思うので、そんなに使わないかもしれませんが一応。

setupチャンク

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
knitr::opts_chunk$set(cashe = TRUE)
knitr::opts_chunk$set(message = FALSE)
knitr::opts_chunk$set(warning = FALSE)
knitr::opts_chunk$set(out.width = '\\textwidth')
```

setupチャンクでは、この設定がいいかなと思います。 最後の行のknitr::opts_chunk$set(out.width = '\\textwidth')によって、グラフは書ける幅いっぱいの大きさで書いてくれます。 column環境の外であれば本文の幅いっぱい、column環境の中であればcolumn環境内の本文の幅いっぱいの大きさでグラフを出力してくれます。

```{r packages, include=FALSE}
library(ggplot2)
library(dplyr)
library(xtable)
options(xtable.comment = FALSE)
```

私は上記のようにパッケージも分析パートとは別に記載しておくようにしています。

文献等を引用する

引用をする際には、[@Citation Key]とします。 bibファイルでいうと@article{Citation Key,の部分です。 引用すると最後に自動的に引用文献一覧を作成してくれます。 citrのアドインを使うと簡単に引用できるようになります。

Rで作成した表や図を表示する

Rmd内でRのコードを利用するには、チャンクと呼ばれるものの中にRのコードを記載します。 先頭行では、オプションなどを指定しています。

```{r}
summary(iris)
```

表を書く場合にはこのようなコードを書きます。

```{r iris,results = "asis", include=TRUE}
iris %>%
  head(5) %>%
  xtable(digits = 2, type = "latex", comment = FALSE, caption="irisの上から6行を例示", label = "table_label") %>%
  print(include.rownames=FALSE, scalebox = 0.95, caption.placement = "top")
```

表を書く場合には、results = “asis”とすることで、xtableが作成したLaTeXのコードを評価して表を作成してくれます。 なお、私はなんとなくxtableを使って書くことが多いですが、他にも表を書くパッケージはあります。

図の場合は、オプションでfig.cap=“図のキャプション”としましょう。

```{r chunk_label, include=TRUE, fig.cap="花弁の長さと幅の散布図"}
ggplot(iris,aes(x=Petal.Length, y=Petal.Width))+
  geom_point()
```

数式を書く

数式の書き方はLaTeXを少し勉強してみると面白いと思います。 $$ $$で囲むと数式を書くことができます。 LaTeXでも同じ書き方をしますが、私はalignなどを使って書いてしまいます。

\begin{align}
r_{xy} = \dfrac{\Sigma_{i=1}^n (x_i-\overline{x})(y_i-\overline{y})}
            {\sqrt{\Sigma_{i=1}^n (x_i-\overline{x})^2}
             \sqrt{\Sigma_{i=1}^n (y_i-\overline{y})^2}}
\label{equation_label}
\end{align}

また、個人的に総和記号は\sum\fracの中で書くときれいにいかないことが多い気がするので、\Sigmaをあえて使うようにしています。 また、LaTeXを使っているため、TikZを使うこともできます。 今回使ってみましたが、私のTikZ力が低いためそこまできれいには書けていません。

表・図・式を参照する

表や図、式の番号を参照する際には\ref{}を使います。 表の場合は、xtableだと引数でlabel="table_label"などとして、表\ref{table_label}とすれば、参照してくれます。 図の場合はチャンク名がラベルになるので、図\ref{chunck_name}とすれば参照できます。 式の場合は、align環境などで\label{equation_label}とすれば、参照できるようになります。

表の中で特殊文字を使う

表の中でギリシャ文字などの特殊文字を使いたい場合もあると思います。 私の場合はStanで分析した結果にギリシャ文字を与えるために使いました。

rownames(X) <- c("$\\alpha$", "$\\beta$")
xtable(X, type = "latex", comment = FALSE) %>%
  print(sanitize.text.function =function(x) x)

列名や行名にギリシャ文字などが入ったXをxtable()でLaTeXに変換し、print()内でsanitize.text.function =function(x) xとするとギリシャ文字が使えるようになります。

今回作ったファイルはgithub で保存しています。

Enjoy!