igjitさん、hanaoriさんと共に「Rが生産性を高める〜データ分析ワークフロー効率化の実践〜」を共著しました。
- 公式サイト:https://gihyo.jp/book/2022/978-4-297-12524-0
- サポートサイト: https://github.com/ghmagazine/r_efficiency_book
電子版の発売は1/21、紙版の発売は1/26となっています。早くみなさんの元にお届けしたいですね。
ちなみにジュンク堂書店池袋本店さんや書泉ブックタワーさんなどの一部店舗では先行販売が始まっています。
ところで最近のプログラミング関係の技術書は、サポートサイトという形で記載したコードをGitHubなどに公開することが増えているそうで、我々も倣うことにしました。
この記事ではサポートページをどうやって効率的に用意したか紹介します……がR言語は使っていません(笑)
なお、誤字など「書籍内容に関するお問い合わせ」はリンク先の技評のページからお願いします。
本について
Rを実践的に使う書籍というと分析手法や可視化に関連したものが多いなか、稀有な一冊になったかなと誇らしく思っています。
愛称は「登山本」で、表紙もそれに合わせてます。これは著者一同が山好きなことと、山登りって装備一つで凄く体験が良くなることとに由来しています。本書に収めた色んなパッケージやテクニックが、みんなの生産性を高める装備になると嬉しいです。
サポートページの作り方
サポートページに掲載するコードはマークダウンで記述することにしました。宇宙本のサポートページにはRスクリプトが掲載されていたりしますが、登山本ではR言語以外にもYAMLやHTMLなどのコードが登場することもあり、章ごとに一覧しやすいマークダウンを選んだ次第です。
元々原稿をR Markdownで記述しmarkdownに出力していたこともあり、コードブロックだけ残せばすぐにサポートページができるという都合もあります。ついでに見出しも残しておくことで、読者の方々が目的のコードを探してコピペしやすいようにしました。
Rで似たようなことをやる手段としては knitr::purl
関数がありますが、これはRmdファイルなどからRコードを抽出することにフォーカスしています。
今回は、目的に合致するPandocを採用しました。 Pandocは文書形式を相互に変換するソフトウェアで、R MarkdownでもHTMLファイルやWordファイルを作成するのにPandocを利用しています。
PandocにはLuaフィルタという、入力した文書をLua言語を使って弄ってから出力する機能があります。これを使うと見出しは全部太字にするとかいった操作が簡単にできます。基本は操作したい要素の名前の関数を書くだけです。見出しを操作したいならHeader
関数ですね。引数名前は任意ですが、element(要素)の略でel
が多いです。
-- 見出しを全部太字にするフィルタの例
function Header(el)
el.content = pandoc.Strong(el.content)
return el
end
詳しい書き方は公式ドキュメントを参照してください(https://pandoc.org/lua-filters.html)。
今回は文書の要素を上から順に処理したいので、Pandoc
という関数を作成します。その上で出会った要素が以下の条件を満たす場合のみを残し、他を捨てるという操作をしました。
CodeBlock
で且つresult
以外のクラスを持つHeader
function Pandoc(doc)
local hblocks = {}
for i,el in ipairs(doc.blocks) do
if (el.t == "CodeBlock" and el.classes[1] ~= "result") or
(el.t == "Header") then
table.insert(hblocks, el)
end
end
return pandoc.Pandoc(hblocks, doc.meta)
end
この関数をfilter.lua
などといったファイル名で保存しておきます。あとはPandocを呼ぶだけ。
ch01.md
ファイルをfilter.lua
で弄りながらGitHub-Flavored Markdown (gfm)に変換するといったことができちゃいます。
pandoc ch01.md -t gfm --lua-filter filter.lua
実際には変換対象のファイルや変換後の保存先なども自動処理しちゃいたいので、シェルスクリプトを書いてます。