R
Knitr

逆引き knitr

More than 5 years have passed since last update.


knitr で数式を埋め込む

knitr では, $f(x) = a x + b$ のように数式を $\TeX$ 記法で表記することができます.

数式を表示するために,mathjax という JavaScript ライブラリが使われています.

数式は文章中に埋め込むインラインとして書く方法とブロックとして書く方法があります.

筆者は,$\TeX$ 記法がどこまでサポートされているかまでは確認しておりません.


インラインに数式を記述

数式をインラインとして表示するためには,\$...\$ の間に数式を記述します.


記述例

数式を,$f(x) = a x + b$ と書きます.


出力結果

数式を,$f(x) = a x + b$ と書きます.


ブロックとして数式を記述

数式をブロックとして表示するためには,つぎのように数式を記述します.

$$latex

LaTeX 記法で数式を記述
$$


記述例

$$latex

f(x) = a x + b \\
f(x) = a x + b
$$


出力結果

f(x) = a x + b \\

f(x) = a x + b


記述例

$$latex

\begin{aligned}
\dot{x} & = \sigma(y-x) \\
\dot{y} & = \rho x - y - xz \\
\dot{z} & = -\beta z + zy
\end{aligned}
$$


出力結果

\begin{align}

\dot{x} & = \sigma(y-x) \\
\dot{y} & = \rho x - y - xz \\
\dot{z} & = -\beta z + zy
\end{align}


数式を表示するための R のコマンド

knitr を使って数式が含まれた R markdown を HTML に変換するためには,つぎのように knit2html 関数 の options'mathjax' を指定します.

knit2html("mathjax.Rmd", options=c("mathjax"))


注意

数式を表示するための JavaScript ライブラリ mathjax は,生成された HTML ではつぎのように読み込まれています.

つまり,ネットに繋がっていない環境では,mathjax が読み込まれないので数式を表示することができません.

<!-- MathJax scripts -->

<script type="text/javascript" src="https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>


プロット画像を Base64 として埋め込む

分析した結果を共有数時に,ファイルをただ1つ渡すだけで済ませたいことがある.

通常,knitr で HTML に変換をすると,HTML ファイルと画像ファイルは別々のファイルである.

Base64 を利用して HTML の <imt> タグに画像を埋め込むことができる.

つぎのように,opts_knit$set で設定を追加してやればよい.

library(knitr)

opts_knit$set(upload.fun = image_uri)
knit2html("foo.Rmd")


R markdown 中の R ソースコードのみを抽出する方法

R markdown のチャンクに埋め込んだ R のソースコードのみを取り出す方法を説明します.

つぎのように,purl 関数を R markdown ファイルに適応することで,R のスクリプト部分のみを抽出ができる.

purl("foo.Rmd")


別の R markdown ファイルを取り込む方法


  • 複数人でドキュメントを作成しているようなとき

  • ドキュメントが長くなるので分割したいとき

そのようなときに,ファイルを分割して入れ子にすることができます.

そのためには,チャックオプション child を利用します.

child には R のベクトルで c() にファイルの相対パスを指定します.

` ``{r child=c('040-reverse-lookup/math-formula.Rmd')}

` ``


チャンクにラベルを付ける

各チャンクにはラベルをつけることができます.

イメージとしては,HTML の id に相当するものと考えてください.

たとえば,plot-iris というラベルをつけるには,下のように記述します.

ラベルをつけることのメリットは,チャンクの参照や共有に利用できる点です.

また出力されるプロット図の名前のつき方が,無指定の unnamed-chunk-xx.png から plot-iris1.png のようになります.

` ``{r plot-iris, fig.width=3, fig.height=3, echo=FALSE}

plot(iris)
` ``


ラベルを参照してコードの内容を再利用する

ラベル plot-iris のコードを再利用して,コードを表示します.

利用方法としては,Appendix としてコードをあとで表示するなどがあります.


記述例

` ``{r plot-iris, fig.width=3, fig.height=3, echo=FALSE}

plot(iris)
plot(cars)
` ``

` ``{r plot-iris, eval=FALSE}
` ``


出力結果

plot of chunk plot-iris plot of chunk plot-iris

plot(iris)

plot(cars)


Markdown ファイルを HTML / PDF / Word などに変換

R の knitr パッケージでは,knit2htmlknit2pdf で R markdown ファイルを HTML や PDF に1コマンドで変換することができます.


Markdown を HTML に変換する方法

library(knitr)

pandoc('foo.md', format='html') # HTML
pandoc('foo.md', format='latex') # LaTeX/PDF
pandoc('foo.md', format='docx') # MS Word
pandoc('foo.md', format='odt') # OpenDocument


R markdown を pandoc コマンドで

結局のところ, Rmd (R markdown) は markdown に変換したあとに HTML / PDF / Word などに変換されます.

knit 関数は,R markdown を markdown に変換する関数です.

pandoc 関数で markdown ファイル引数に,knit 関数を直接与えれば,Rmd から HTML などにワンライナーコマンドで返還できます.

library(knitr)

pandoc('knit(foo.Rmd'), format='html') # HTML


(R) markdown を変換するときのオプション指定方法

knitr では,(R) markdown を HTML に変換するための関数


knit2html に変換するときにオプションで渡す

R markdown を HTML に変換する関数 knit2htmloptions

knit2html("foo.Rmd", options=c("toc", "mathjax"))


markdown 中に設定を書く

(R) markdown ファイルの先頭に,つぎのような pandoc の設定を書き込むことができます.

また変換形式が HTML か PDF などで,pandoc に渡すオプションを買えることができます.


(R) markdown の先頭に設定を記述

この場合は,markdown でも R markdown でも同じ書き方でだいじょうぶです.


foo.Rmd

<!--pandoc

t: html
s:
mathjax:
toc:

t: latex
latex-engine: xelatex
number-sections:
output: 084-pandoc-xelatex.pdf
-->



R での実行コマンド

pandoc の設定をが含まれた,(R) mardkwon を HTML に変換するときはつぎのコマンドになります.

pandoc(knit("foo.Rmd"), format="html")


設定ファイルを外部に持つ


(R) markdown ファイルとは別に設定ファイルをを作成


pandoc_config.txt

<!--pandoc

t: html
s:
mathjax:
toc:

t: latex
latex-engine: xelatex
number-sections:
output: 084-pandoc-xelatex.pdf
-->



R でのコマンド実行

別に作成した pandoc の設定ファイルを,pandoc 関数の config オプションに与えます.

pandoc(knit("foo.Rmd"), format="html", config="pandoc_config.txt")


参考


プロット図をアニメーションにする方法

Gif 画像のようにして,何枚かの画像をアニメーションとして見たい時があります.

そのようなときは,scianimator を利用することで,実現することができます.



  1. opts_knit$set 関数の animation.fun オプションに,hook_scianimator を指定

  2. R markdown 中に HTML タグとして必要なリソースを読み込む

  3. コードチャンクのオプションに fig.show='animate' を指定

  4. コードチャンクの中の処理で,プロット図を複数生成

注意としては,HTML のリソースが外部環境に依存しているので,ネットワークでリソースを見に行けないときはアニメーションとして表示されません.


R markdown

` ``{r}

opts_knit$set(animation.fun = hook_scianimator)
` ``

<link rel="stylesheet" href="http://vis.supstat.com//assets/themes/dinky/css/scianimator.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="http://vis.supstat.com/assets/themes/dinky/js/jquery.scianimator.min.js"></script>

` ``{r test_hook_scianimator, fig.show='animate', interval=.5}
n = length(palette())
x = rnorm(n); y = rnorm(n)
for (i in 1:20) {
x = x + rnorm(n); y = y + rnorm(n)
plot(x, y, xlim=c(-10, 10), ylim=c(-10,10), pch=19, col=1:n, cex=2)

}
` ``


WebGL を利用してインタラクティブな 3D プロット図を出力

3D のプロット図をインタラクティブに操作する方法として,WebGL を利用した描画方法がある.

注意としては,WebGL の機能を利用するので,WebGL に対応していないブラウザでは閲覧することができません.


R markdown

` ``{r webgl_setup}

knit_hooks$set(webgl = hook_webgl)
` ``

` ``{r test_webgl, webgl=TRUE}
x <- sort(rnorm(1000))
y <- rnorm(1000)
z <- rnorm(1000) + atan2(x,y)
plot3d(x, y, z, col=rainbow(1000))
` ``