文書の過去の版を表示しています。
目次
Rmarkdown
主にRmarkdownからPDFを生成する際のメモ。Latexを経由するためLatexの知識も必要だが、RmarkdownからLatexにコマンドなどを渡す際の方法など、直接Latexを記述する場合とは異なるtipsがある。また、Rmarkdownでloopを回してチャンクを作成する方法など、効率化する手段も色々ありそう。
PDF出力用の基本設定
新しいコマンドを理解するたびに拡張している。とりあえず2020/05/05現在のもの。
ヘッダ部分
title: "タイトル" author: "作成者" date: "2020/05/05" output: pdf_document: keep_tex: yes latex_engine: xelatex number_sections: yes always_allow_html: true geometry: no header-includes: - \usepackage{amsmath,amssymb} - \usepackage{mathspec} - \usepackage{indentfirst} - \parindent = 1em - \usepackage{zxjatype} - \setmainfont{Century} - \setsansfont{Century} - \setjamainfont{MS Mincho} - \setjasansfont{MS Gothic} - \usepackage{float} - \setpagelayout * {margin=20mm} - \renewcommand{\baselinestretch}{0.9} - \usepackage[compact]{titlesec} - \titlespacing*{\section}{0pt}{*0}{0pt} - \titlespacing*{\subsection}{0pt}{*0}{0pt} - \renewcommand{\labelitemi}{■} - \renewcommand{\labelitemii}{$\circ$} - \usepackage{caption} - \captionsetup[table]{skip=5pt} - \captionsetup[figure]{skip=2mm} - \renewcommand{\textfraction}{0.001} - \renewcommand\floatpagefraction{0.99} - \setcounter{topnumber}{10} - \setcounter{bottomnumber}{10} - \setcounter{totalnumber}{20} - \makeatletter - \setlength{\@fptop}{0pt} - \setlength{\@fpsep}{8pt} - \setlength{\@fpbot}{0pt plus 1fil} - \makeatother - \makeatletter - \renewcommand{\theequation}{% 式番号の付け方 - \thesection-\arabic{equation}} - \@addtoreset{equation}{section} - \renewcommand{\thefigure}{% 図番号の付け方 - \thesection-\arabic{figure}} - \@addtoreset{figure}{section} - \renewcommand{\thetable}{% 表番号の付け方 - \thesection-\arabic{table}} - \@addtoreset{table}{section} - \makeatother documentclass: bxjsarticle subparagraph: yes classoption: xelatex,ja=standard
最初のsetupチャンク
PDFファイルを作成するとき、ggplotで日本語を含む図表を美しく出力するために図表をcairo PDFで作成する設定や、全体のチャンクオプションを一括して設定する。
```{r setup, include=FALSE} knitr::opts_chunk$set(echo = FALSE) knitr::opts_chunk$set(warning = FALSE, message = FALSE) # Latexのfloatを使う場合の図表のfloatオプションを設定 knitr::opts_chunk$set(fig.pos = 'h') # キャッシュの設定。執筆中は時間短縮のためキャッシュを有効に。最後にOff knitr::opts_chunk$set(cache = TRUE) # 出力フォーマットが TeX(PDF含む)の場合のみ対処する if (knitr::opts_knit$get("rmarkdown.pandoc.to") %in% c("beamer", "latex")) { # conversion failure on '...' in 'mbcsToSbcs' の Warning 発生の workaround options( device = function(file, width = 17, height = 17, ...){ cairo_pdf(tempfile(), width = width, height = height, ...) } ) ## 1. cairo_pdf を使う方法 # * family には OS にインストールされているフォント名を指定する。 #knitr::opts_chunk$set(dev="cairo_pdf", dev.args=list(family=c("Century","MigMix 1M"))) knitr::opts_chunk$set(dev="cairo_pdf", dev.args=list(family=c("MS Mincho", "Century"))) }
図のチャンクオプション
詳細な設定はもっといろいろあるが、基本の設定。PDFの出力が前提なので、ベクタ画像を利用するため解像度はあまり意識しなくてよいようなので、out.widthで横幅を設定し、縦は横幅との相対的な比率で調整するようにした。図は中央寄せ。
```{r チャンク名, fig.cap="キャプション", out.width="90%", fig.asp=0.5, fig.align="center"} ```
Loopでチャンク作成
図表を連続して作成する場合など、チャンク内のLoopから別のチャンクを生成したい場合がある。
まずテンプレートとなるチャンクを作成する。ループで回すように、必要な個所は変数化し該当箇所を「変数名」にしておく。以下の例では、チャンク名とキャプション、ggplotのy軸に使う変数名を外部から与えるパラメータにした。
```{r チャンク名_{{prm_chankname}}, fig.cap="{{fig_name}}", out.width="90%", fig.asp=0.45, fig.align="center"} ggplot(data=DAT, aes(x=時間, y={{target_var}}) + geom_line() ...
```
呼び出し側はknitr::knit_expandを利用する。第1引数はテンプレート名、第2引数以降は設定したパラメータを列挙する。ループなどを使う場合は、変数でパラメータを渡してやればよい。他にもif_elseなどで条件別にパラメータを変更したりなど、いろいろできる。Knit_expandでテンプレートに変数を埋め込んだ状態のコードをオブジェクトにいったん保存する。次に、knitr::knitでオブジェクトに入れておいたチャンクを解釈したうえでcatでRmarkdown側に出力する。これで、ループを使って連続的にチャンクを生成できる。デバッグをする場合などは、インラインで図表を確認できない(生成されたチャンクのコードが表示される)のでちょっと不便。
rmd <- paste( knitr::knit_expand( "sub.Rmd", prm_chankname="チャンク名", fig_name="キャプション", target_var="工場1" ), collapse = "\n" ) rendered <- knitr::knit(text = rmd, quiet = TRUE) cat(rendered, sep="\n")
コードチャンク内からLatexの改ページを出力
ループなどを使って連続的にグラフを出力するとき、グラフ以外にLatexのコードも出力したい場合がある。
改ページを出力する場合。チャンク出力の変更と、Latexコマンド前後に改行を入れて、Latexコードに変換された際に適切に解釈できるようにすることが重要。
# チャンクの出力をasisにして生のRの結果を出力 ```{r results="asis"} # catで\newpageを出力 # 前後に改行を入れ、コマンド冒頭の「\」をエスケープ cat("\n\n\\newpage\n") ```
半角スペース
日本語を出力する関係でtexエンジンはxelatexを使うため、半角スペースは適切にエスケープしておかないと出力されない。エスケープの仕方は場所によって異なる。例えばknitr::kableのcaptionに設定する場合ならば
caption="日本語のテキストに\\ 半角スペースを入れます。"
のように、半角スペースの前に「\\」を入れる。他方で、ggplotなどでグラフを出力する際に、チャンクオプションに指定する「fig.cap」では以下のようにする。
... fig.cap="日本語のテキストに\\\ 半角スペースを入れます"
こちらではは「\」が3つ必要。おそらく1つ目はLatexコード認識のため、2つ目は3つ目の「\」のためのエスケープ。
テーブルの5行ごとに縦スペースを追加(しない)
Rで作成した表は、knitr::kableおよびkableExtrパッケージを利用すると、比較的容易に美しくPDFに出力できる。
Latexの機能かRmarkdown、pandocの機能かは調べていないが、標準ではLatexに変換した段階で表の5行ごとに\addlinespaceが入っている。場合によっては等間隔にしたい。これを解除するためには、kableに以下のようにオプションを渡す。
kable(...., linesep="")
linesep=““はkableのヘルプに記載されいないが、kable_latexに引数がそのまま渡されて解除されるようだ。
テーブルなどのラベルを改行する
Latexに変換するときに改行を保持するための関数を使わないと、R側の改行が無視される。
col.names = linebreak(c("男性","女性","クラス\n全体"))
このように、改行「\n」が入った文字列やベクトルをlinebreakに渡してやるとよい。