なまえ:niszet
ぞくせい:Rおじさん 兼 回路設計miscおじさん
すてーと:4月末退職して次のステージへ
R界隈で活動したい。
でも、分析とかやってないのでなんもわからん
R Markdownはわかる…けど
Word形式へ出力する情報が全然見つからない
ないので書いた
技術書典5で初頒布。累計140?部くらい出ている。
R Markdownで書いてWordに変換してpdfにして入稿。
気づいたら1か月くらいで80ページになっていた不思議
R言語で文書作成する際のデファクトスタンダード。
後段でPandocを使用することを前提として、
R言語で書かれた処理の結果(図や表など)を含んだMarkdownが作成できる。
文書形式の変換はPandocが担当するため、基本的にはPandoc’s Markdownで書く必要がある。
コードはブロック形式、インライン形式それぞれで記述可能。用途に合わせて使用する。
和書が比較的充実している。ネット上に情報も多い。
R Markdown入門 - kazutan on web
https://kazutan.github.io/kazutanR/Rmd_intro.html
R Markdown: The Definitive Guide
https://bookdown.org/yihui/rmarkdown/
ドキュメント・プレゼンテーション生成(ちょっと古い記述もあるかも)
https://www.kyoritsu-pub.co.jp/bookdetail/9784320123724
他にも検索すれば沢山情報が手に入る(はず)
R 言語は統計関係のライブラリが多く、可視化や前処理、ドキュメント化にも強い。
R MarkdownはRだけでなく、PythonやJuliaなどの言語の実行結果を使うことも可能。
R Markdown: The Definitive Guide 2.7 Other language engines
https://bookdown.org/yihui/rmarkdown/language-engines.html
実行結果を含むドキュメント自動生成に広くR Markdownが使用可能なのでは?
以下ではWindows上で使用することを想定しています。
そもそもMacでOfficeはツライ(らしい)
R自体はMac/Linuxでも使用可能だし、docxファイルの作成自体はLinux上でも可能。
R, RStudio, RTools, Windows, Pandoc, Wordのそれぞれのバージョンが揃っていないと完全再現できない(と思う)
実際に新しいPandocのバージョンで作成したPowerPointのテンプレートが古いPandoc側で使用できないなどの問題はあった。
WindowsやWordはOffice365だと勝手に更新されるのでバージョンを保つのは困難(今のところこれが問題となったことはないけど)
Setup自体はかなり簡単なので、導入はしやすい。
Q. Docker使えばいいんじゃないですかね…?
Rをダウンロード
R Studio IDEをダウンロード
RToolsをダウンロード
(必要なら)Pandocを置き換える
Pandocは同梱されているが、少し古い場合がある(Pandocの更新が速すぎるという説)
# Pandocのファイルパスを確認(RStudioの下にあるはず)
rmarkdown::pandoc_exec()
# Pandocのバージョンを確認
rmarkdown::pandoc_version()
Pandocのバージョンを変えたい場合は、上のコマンドで確認したファイルパスにある実行ファイルを所望のバージョンのPandocで上書きする。上書き後、RStudioは念のため再起動する。
R MarkdownからMarkdownへの変換をRのパッケージで対応している。
knitr
や rmarkdown
パッケージでhtml, word, pdfなどに対応出力形式毎にパッケージが存在する
GitBook形式などの bookdown
CSS組版の pagedown
HTMLスライドの revealjs
などなど…
どの形式でもMarkdownファイルに変換後はPandocで変換処理をするので、Pandocの知識はある程度のレベル以上から必須となる(はず)
R Markdownはプログラムを埋め込むことが出来るMarkdownだと思えばよく、Markdownの生成を自動化したり条件によって処理を変えるなどといったことが可能。
肝心のフォーマット変換はPandocが行うので、Pandocに出来ないことはR Markdownでも基本的には“出来ない”。
生成後のファイルをRを使って直接修正する方法もあるけど…
officer
パッケージなどとりあえずMarkdownを書いてファイルを変換、動かしてみる
設定を変更して出力ファイルを見て判断
Pandoc native形式とLua filterに手を出す(他の言語のFilterでも良い)
Reader/Writerに手を出す(Haskell…)
Pandocのマニュアル(User’s Guide)を読むか、R Markdownのマニュアルが便利(最低限がまとまっているので)
\
かみたいな細かい話はPandoc User’s Guideを読まないとわからない。Markdown全般について知るなら、書籍はコレでしょ!
Pandoc User’s Guide
https://pandoc.org/MANUAL.html
(新・工事中)Pandocユーザーズガイド 日本語版
https://pandoc-doc-ja.readthedocs.io/ja/latest/users-guide.html
何度読んでも何度も忘れるので何度も読み直す必要がある…。
ただし、書いてあることとちょっと挙動が異なるような…?みたいなことはある(が、各種環境の違いで再現しないことが多々あるのでなんとも…)
ちょっとわかりにくいよね…って部分があるので自分で書いてみないとわからない部分多々あり。
Markdown extensionsのうち、デフォルトで有効なものとそうではないものがある。これはマニュアルには明記されていない
あったら教えてください…
たぶんこれもコード読む必要がある…
Word本でも主要なものは明記したが、使用頻度が低そうなものは除いた。HTML出力の場合などもまた別にあるので…
とりあえず使ってみよう。
自分が良く使う設定や文法は一通りテンプレートにしてコピペしておくのが一番…
設定は好みがあるので、どれがベストかは…??
わかってる人に聞くのが一番
世の中にはドキュメントはWord形式で欲しいと言ってくる層が一定数いる。
分析界隈でもそうらしい…。
JTC…?当然ですね…。
書いたときは絶対需要ないと思ったのにそれなりにウケてるのが不思議…。
Wordで直接書く場合も段落や文字に対して見栄えを定義したスタイルを使って書いた方が良い
PandocでWordに変換する場合、文章の構成要素それぞれにWordのスタイルが割り振られる。
Wordはスタイル毎に見た目の設定が出来るので、対応関係がわかっていればMarkdownを書くだけでいい感じの見た目のWordドキュメントが作れる。
Pandocで生成する文書の見栄えを決めるのはテンプレート。
Wordの場合は--reference-doc
で指定する。
Word自体は結構高機能なので、大体のことが出来る。ヘッダーフッターも設定しておけば有効。
スタイルの設定が大変だが、一度テンプレートファイルを作成すれば使いまわしがきくので時間をかける価値はある。
ない。
実は昔書いている。未だにアクセス数がとても多い謎。
Pandocを使う以上はMarkdownの各Block, Inline要素がどのスタイルに割り当てられるのか?は共通なので、MPEでも同じ。
どのようにスタイルが割り当てられているかは、PandocのWriterのコードを読めば多分わかるはず。
Text/Pandoc/Writers/OpenDocument.hs
あたりにありそうしかし、当時は(今も)Haskellの解読がniszetにはちょっと厳しかったので、結局、書いて変換して確認する…を繰り返し実行した(ツライが確実)
Wordの場合はStyleでかなりの部分が対応できる。
https://pandoc.org/MANUAL.html#custom-styles
特にCustom Styleを使えれば、任意のStyleを割り当てられるので便利
見出し1に改行を入れるといったことも可能(#
を使うと改行入れられない)
これをRの関数で表現すれば本文が見づらくなることもない(はず)
スタイルを設定したテンプレートを使おう
Markdownから作ればWordから直接書くよりもスタイルを有効に利用できる。
スタイルの設定は面倒…
拡張子がdocxのWord文書のファイルはzipされたxmlファイル。
PandocにはGeneric raw attributeがあるので、これを使って出力先の形式のコードを直接埋め込むことが出来る。
Wordの場合はOffice Open XMLで書かれたコードをそのまま埋め込むことが可能。
Markdownにはページの概念がない(HTMLにもないけどネ)
Wordで出力する場合は「丁度良い場所で改ページしたい」ことがある
公式のマニュアルにも改ページの例が載っている
任意のOOXMLを埋め込むことが出来るが、 一番外側は<w:p>
タグで囲う形にすること。
document.xmlに含まれる内容のみ対応できる。他のファイルに影響を与えるようなものはダメ。
文章中にコードを埋め込むと、文章としての可読性はかなり落ちる(ブロックなら折りたたむなども出来るが)
Rの関数化、パッケージ化することで、見づらいOOXMLのブロックが文書中に散りばめられることがなくなる。
インラインにRのコードが書けるのでOOXMLのコードブロックを文字列として返す関数を定義すればよい。“R” Markdownを使う強みの1つ。
出来るだけ文章書くことに専念できるようにパッケージ化して「おまじない」にしたい
OOXMLを使うことで、Markdownで表現できないWordの機能を使うことが可能
しかしWordは機能が多すぎる&OOXMLの解読がとても大変なので、Styleの使いこなしができてからでよいと思います。
R側で出来ることは多いが、Pandocの仕様的に逃げられない部分はPandoc側で何とかしたい。
Lua filterを使えば良さそう。Writerの処理を迂回することができる。
Lua filterはnative形式のデータ構造に対して変換処理をかけるので、nativeデータ構造の理解は大事。
PandocはReaderでファイルを読み、一旦Pandoc Native形式に変換してそれをWriterで所望の形式に変換している。
-t native
を指定すればNative形式で出力することも可能。
意図した変換結果が得られなかった場合、一旦nativeで出力するのはアリ。
中身はASTなのでそんなに難しくはない(諸説あります)
PandocはLuaで書かれたFilterが使える。
Lua Filterは環境に依存しない(LuaがPandocに含まれている)ため移植性が高い。Luaもバージョン5.3なので最新(?)環境が使える。
PandocのASTを変換するので、Writerで処理しているものには対応できない。
これも公式の説明やLua filterのリポジトリがあるのでそれを参考にするのがよさそう。
Pandocがどういう要素とプロパティを持っているかはPandocのLua filterの解説を読みましょう。
このページが一番詳しいんだけど、どう書けば良いのかは難しい(教えて)
Pandocの内部のデータ構造がわかるとLua filterの書き方がわかってきますよ(?)
Programming in Lua の Fourth edition がLua5.3の情報も載っていて(むしろ5.3の話がメイン)良い。翻訳版はまだなさそう。
Lua5.xでも基本的な文法はほぼ問題ないので、Webにある日本語で書かれたサイトから入門する方が良さそう。
リファレンスマニュアルは日本語訳されている。
tableまでの話と関数の書き方がわかれば「とりあえず動かすレベル」は出来る
Code
が入る場合、Source Code
のスタイルがCodeに当てられてしまうため、周囲の文字列とフォントやフォントサイズが違い、見た目がおかしくなる。下記のように簡単(?)に実現できる。
function Header (elem) ... end
でHeader要素に対して処理が出来る。
戻り値はpandoc.要素
で返すと良いが文字列でも良さそう。
Luaは比較的型に寛容だがPandoc(Haskell)は厳しいのでnumericを返すとエラーになるので注意。
自身の子要素でCodeがあったらSpanを使ってカスタムスタイルをあてている。
Wordのスタイルは段落と文字の2種類がある(PandocのBlockとInlineに相当する)
そのため、Word形式で出力する場合、スタイルの割り当てで対応するスタイルがないとうまくスタイルをあてられない。
Wordと比べてスタイルが設定できないなど制限が多い。
revealjsのスライドの場合はcssを頑張れば良いのだが、PowerPointの場合は…Lua filter+OOXMLで対応するしかなさそう(ツライ)
でもつくってLTした
https://speakerdeck.com/niszet/r-markdownwoshi-tutazai-xian-de-repoteingu
本も書いた…が、現状では制約が多くて厳しい…。
R MarkdownでWordを作るのは全然いける
まだもうちょっと頑張りどころがある
ここでは紹介しきれなかった細かいツラミがある…
しかし、R/Markdown/YAML/Lua/Haskell/OOXML … と押さえないといけないもの多すぎじゃないですかね…