前回はレポートづくりのオートメーション化がもたらすメリットについてやや概念的な説明をしました。今回はR Markdown環境を導入し、
また、
なお、
R Markdown環境の導入
R Markdownを利用するには、
- R
{rmarkdown}
パッケージ- pandoc
の3つのツールを導入する必要があります。
- PDF形式のレポートの作成に必要なLaTeX環境の導入については、
PDFレポート作成の回に解説します。 - RStudioには
{rmarkdown}
パッケージとpandocが入っているので、個別のインストールが面倒な場合はRStudioを使ってください。意識の高い我々は基本的に生Rで作業を進めます (バッチ処理によるレポート作成などを想定しています)。RStudioの活用については別の回で説明します。
Rのインストール
CRANからRをインストールします。解説がWeb上に大量にあるので参考にしてください
{rmarkdown}
パッケージのインストール
Rを起動して、
install.packages("rmarkdown", dependencies = TRUE)
とします。CRANのミラーサイト選択画面が表示されたら、{rmarkdown}
パッケージを使うために必要な依存パッケージも自動的にインストールされます。
pandocのインストール
pandocは様々な形式のドキュメント変換を行うツールです。pandoc公式ダウンロードサイトからインストーラパッケージをダウンロードしてインストールします。ダウンロードリンクが少しわかりにくいですが、pandoc-1.
pandoc-1.
インストールの確認
すべてインストールしたら、
library(rmarkdown) pandoc_available()
としてみてTRUE
と出力されればOKです。
ダメな場合はおそらくpandocのパスの設定の問題ですが、
さて、
R Markdownによるレポートの書式と作成手順
R Markdownによるレポート作成は、
- ドキュメントとRのコードをR Markdownファイル中に記述する。
- R上で
rmarkdown::render()
関数によりR MarkdownファイルをHTML形式(またはDOCXやPDF形式) に変換する。
という手順で進めます。
R Markdownファイルは、.Rmd
という拡張子を持つテキストファイルです。この中に、
R Markdownファイルは、
# タイトルとか
`r Sys.Date()` @kohske
- レポートの説明とか
- 概要とか
- 云々
```{r}
# ここには解析コード
foo = rnorm(1000)
hist(foo)
```
さらに説明とか
- 今後の目標とか
- 人生の目標とか
```{r}
# ここにも解析コード
df = subset(mtcars, select = mpg:qsec)
knitr::kable(head(df))
```
このR Markdownファイルのファイル名をsample.
としましょう。これをHTMLレポートに変換するには、
library(rmarkdonw) # パッケージの読み込み setwd("dir-of-sample") # 作業フォルダを変更します render("sample.Rmd") # 変換!! browseURL("sample.html") # ブラウザで開きます
とします。Rを起動することすら面倒な
Rscript -e "rmarkdown::render('sample.Rmd');browseURL('sample.html')"
とすると良いでしょう。HTMLファイルをブラウザで開く必要がなければ、browseURL(...)
は不要です。
参考までに、sample.
を変換して出力されるHTMLファイルsample.
)
- 1つ目のコードの場所にヒストグラムが表示されている。
- 2つ目のコードの場所にテーブルが表示されている。
- 最初に日付が挿入されている。
ドキュメント部分がリストや見出しなどに整形されている。
といったことがわかります。
R Markdownファイルの書き方について、
```{r}
# 解析コード
foo = bar
lm(hoge)
```
という形式の、```
、```
の行をチャンクヘッダと呼びます。チャンクヘッダで```
に続けて{r}
とすることで、
ここまでの記事で、
次に、
チュートリアル1 ~iris
の解析レポート~
サーバログや調査・
ここでは実験データ解析レポートの例として、iris
か……と思う方もいるでしょうが)iris
データセットの解析レポートを作成します。今回はチュートリアル用としてRに付属のデータセットを使っていますが、
また今回のレポートではデータ整形・{reshape2}
、{ggplot2}
、{e1071}
を用いているので、
install.packages(c("reshape2", "ggplot2", "e1071"))
それでは、iris.
というR Markdownファイルを作成しましょう。
---
title: "irisの研究"
author: '@kohske'
date: "2015年5月12日"
output: html_document
---
```{r include=FALSE}
# パッケージの読み込みなどの前処理。レポートには表示しません。
library(knitr)
library(ggplot2)
library(reshape2)
opts_chunk$set(echo=FALSE, cache=TRUE, message=FALSE)
options(width = 1000)
```
# 概要
アヤメのガクと花弁のサイズにより種の分類を行った結果を報告します。
# `iris`データについて
- データ取得日時: 1935年
- データ取得場所: Gaspé Peninsula、カナダ
- データ取得者: エドガーアンダーソン博士
## データ形式
```{r}
kable(head(iris))
```
## 記述統計量など
平均、最小、最大などです。
```{r}
summary(iris)
```
# 種ごとの花びらサイズプロット
3種類のアヤメごとに大きさを箱ひげ図で可視化しました。
```{r}
d = melt(iris)
ggplot(d, aes(Species, value)) + geom_boxplot() + facet_wrap(~variable)
```
# SVMによる分類
サポートベクターマシンによる分類結果を可視化しました。
```{r}
library(e1071) # ライブラリの読み込み
m = svm(Species ~ ., data = iris)
pair = combn(1:4, 2)
for (i in 1:ncol(pair)) {
i1 = pair[1, i]; i2 = pair[2, i]
o = setdiff(1:4, c(i1, i2))
fml = as.formula(paste0(names(iris)[i1], "~", names(iris)[i2]))
slice = list(mean(iris[[o[1]]]), mean(iris[[o[2]]]))
names(slice) = names(iris)[o]
plot(m, iris, fml, slice =slice)
}
```
# 結論
アヤメのガクと花弁のサイズによる種の分類を行いました。
いいと思います。
R上で以下のコマンドによりR MarkdownをHTMLに変換します。
library(rmarkdonw) # パッケージの読み込み setwd("dir-of-sample") # 作業フォルダを変更します render("iris.Rmd") # 変換!! browseURL("iris.html") # ブラウザで開きます
このように、
また、
前回の記事の
あなたはそのレポートを再現できる自信がありますか?
チュートリアル2 ~為替チャートの予測レポート~
日々変動するようなデータを毎晩毎晩レポートにまとめるような場合、
著者はよく海外に行くので、
このレポートでは{quantmod}
と{forecast}
を使っているので、
install.packages(c("quantmod", "forecast"))
なお、
次のようなfx.
というR Markdownファイルを作成しましょう。
---
title: "いつ両替すべきか"
author: '@kohske'
date: "2015年5月12日"
output: html_document
---
```{r include=FALSE}
# 下処理用チャンクなので、レポートには表示しない
library(quantmod)
library(forecast)
# 通貨ペア
target = c("USD/JPY", "EUR/JPY", "GBP/JPY", "THB/JPY")
# 過去120日分のレート取得
getFX(target, from = Sys.Date() - 120)
#save(EURJPY, USDJPY, GBPJPY, THBJPY, file = paste0("fx-", Sys.Date(), ".Rda"))
# ===== ここまでコードチャンク =====
```
# USD/EUR/GBP/THB対円の為替レート
- 左の図は過去120日の為替変動を示しています。
- 右の図は過去30日の為替変動と今後30日の為替変動予測を示しています。
- 右の図のグレイ網掛け部分は予測の信頼区間を示します。
```{r fig.height = 14, echo=FALSE}
# 左に現在まで、右にforecast()による予測を含めてプロットします
par(mfrow=c(4, 2), xpd = TRUE)
minp = list()
maxp = list()
for (tar in target) {
# 現在までのプロット
print(do.call(chart_Series, list(as.name(sub("/", "", tar)),
pars = list(cex = 0.5, mar = c(4,2,2,2), xpd = TRUE))))
# ARIMAモデルで回帰
m = do.call(auto.arima, list(as.name(sub("/", "", tar))))
# forecastで予測とプロット
p = forecast(m, 30)
plot(p, 30)
# 最も円高・円安になりそうな日
minp[[tar]] = which.min(p$mean)
maxp[[tar]] = which.max(p$mean)
}
# ===== ここまでかコードチャンク =====
```
# いつ両替すべきか
```{r, results='asis', echo=FALSE}
for (tar in target) {
cat("- ", tar, "は", format(Sys.Date()+minp[[tar]]), "に両替するのがオトクで、",
format(Sys.Date()+maxp[[tar]]), "はダメです。\n")
}
```
R上で以下のコマンドによりR MarkdownをHTMLに変換します。
library(rmarkdonw) # パッケージの読み込み setwd("dir-of-sample") # 作業フォルダを変更します render("fx.Rmd") # 変換!! browseURL("fx.html") # ブラウザで開きます
cronに登録するなど、
Rscript -e "rmarkdown::render('fx.Rmd')"
このようなオートメーション化されたレポート作成では、render()
でHTMLに変換するだけです。為替データもR Markdownの中で取得しているので、render()
すれば、render()
の実行も不要です。上司には毎晩毎晩、
前回の記事の
それでもあなたは、
まとめ
今回見てきたように、
5月も終わりに差し掛かり、
Enjoy!!
次回からは
次回はR Markdownによるレポートづくりをカスタマイズするための文法・
なお、