読者です 読者をやめる 読者になる 読者になる

Github PagesでR Markdownを表示する

RPubsイケてないなー。ログイン画面暗号化されてないのやだなー。

と思ったときに、yihuiさんのこんな記事を見つけてしまいました。

yihui.name

Github Pagesとは

参考:GitHub Pages

Github Pagesとは、ウェブページを公開できるGithubの機能です。

このウェブページの作り方には2種類あります。表示するHTMLファイルをローカルでつくってGithubにアップするか、Markdownとかで書いてJekyllでHTMLを自動生成するか、です。

Jekyllとは

参考:http://jekyllrb.com/

Jekyllは、Markdownとかプレーンテキストをウェブサイトやブログに変換するためのソフトです。

Wordpressは動的にページを生成しますが、Jekyllは静的なページ生成です。サーバーとのやりとりが必要な処理はできません。たとえばコメント欄はDisqusを埋め込んだりしないとつけられません。

静的ページ生成は似たようなのが色々できています。HTMLファイルを直接pushするつもりならこの辺のを使ってもいいかも。

Github PagesでJekyllを使うには

参考: GitHub Pagesについて(Jekyll側のドキュメント)、Using Jekyll with Pages - User DocumentationGithub側のドキュメント)

やってることはこうです。

0) レポジトリの設定で「Automatic Page Generator」を有効にする
1) レポジトリjekyll newでJekyllに必要なファイルを配置する
2) ローカルでjekyll buildして生成されるページを確かめる
3) 問題なければpushする
4) 新しいファイルがGithub側でjekyll buildされ、新しいページが生成される

で、yihuiさんの記事は、2)でjekyll buildの代わりにservr::jekyll()というコマンドを使えば、markdownファイルからじゃなくてR Markdownファイルからサイトが生成できますよ、という感じのことが書いてます。

ちょっとやってみます。

Jekyllのインストール

Ruby使ったことなくてどのバージョンがいいの分かりませんが、2.2を入れてみます。

Ubuntu用にはbrightboxというところがPPAを用意しているようなので、それを使ってみます。

https://www.brightbox.com/docs/ruby/ubuntu/

sudo apt-get install software-properties-common
sudo apt-add-repository ppa:brightbox/ruby-ng
sudo apt-get update

sudo apt-get install ruby2.2-dev

Jekyllをインストールします。手順は、Githubがgemを用意してくれてるのでそれを使います。:Using Jekyll with Pages - User Documentation

あと、よく分かりませんがNode.jsかtherubyracerというのもインストールしておかないとエラーが出るらしいです。(色々やっているうちに動いてしまったのでよく分からない...)

参考:Rails - Could not find a JavaScript runtime? - Stack Overflow

sudo apt-get install nodejs

sudo gem install bundler

dd of=./Gemfile <<EOF
source 'https://rubygems.org'
gem 'github-pages'
EOF

# ここはsudoをつけない
bundle install

これでたぶんインストールできたはずです。

レポジトリをつくる

参考:Creating Pages with the automatic generator - User Documentation

ここめんどくさいので省略。↑のドキュメントを読んでください。

私の場合は yutannihilation.github.io というレポジトリをつくりました。

Jekyllの設定

とりあえずgit cloneしてきて、.gitignoreだけ残して他のファイルを全部消します。そのうえで、jekyll newでJekyllのひな形をつくります。

cd /path/to/repo/

rm -r *
jekyll new

たぶん以下のファイルができているはずです。

about.md
_config.yml
feed.xml
index.html
css/
_includes/
_layouts/
_posts/
_sass/

ブログ記事用のMarkdownファイルを置くのは_posts/下です。about.mdAboutページ用のMarkdownファイル、_config.ymlはJekyllの設定ファイルです。

これに加えて、R Markdownファイルを置くディレクトリをつくります。_sourcejekyll()のデフォルトなのでそれにしておきます。

mkdir _source

設定ファイル_config.ymlを少し変更します。

ブログのタイトルとか説明とかは適当にうめましょう。

markdownのエンジンがkramdownになってますが、Github Flavored Markdown記法で書きたいのでredcarpetにします。(後述するbuild.Rでの設定はたぶんここと合わせる必要があります。)

markdown: redcarpet

servr::jekyll()の準備

servr::jekyll()は、R Markdownファイルから(いったんMarkdownファイルを生成してから)HTMLファイルを生成するコマンドです。

ただし、servr::jekyll()だけでは動きません。R Markdownをビルドするためのスクリプトが必要です。build.Rという名前のRスクリプトMakefileか、いずれかをつくる必要があります。私は、yuhuiさんのを参考にしてこんなのを書きました。

knitr::render_markdown()を決め打ちで使ってますが、_config.ymlkramdownを選んでいる場合は、knitr::render_jekyll()にする必要があります。

knitr::render_markdown()

local({
  # input/output filenames are passed as two additional arguments to Rscript
  a = commandArgs(TRUE)

  knitr::opts_chunk$set(
    fig.path = sprintf('figure/%d/', digest::digest(a[1]))
  )

  knitr::opts_knit$set(
    base.url = '/',
    width = 70
  )
  
  knitr::knit(a[1], a[2], quiet = TRUE, encoding = 'UTF-8', envir = .GlobalEnv)
})

yutannihilation.github.io/build.R at master · yutannihilation/yutannihilation.github.io · GitHub

これで準備完了です(たぶん)。いよいよページを生成してみます。

R Markdownファイル

JekyllではMarkdown ファイルの名前に決まりがあります。YYYY-MM-DD-foobar.mdという名前にしないといけません。R MarkdownファイルもYYYY-MM-DD-foobar.Rmdという名前にします。これで、たとえば_source/2015-04-01-you-fool.Rmdというファイルを置くと、_posts/2015-04-01-you-fool.md_site/XXX/2015/04/01/you-fool.html(XXXは.Rmdの中で指定したカテゴリ)が生成されます。

あと、Front Matterlayout: postという指定がないと記事用のスタイルが当たりません。RStudioのテンプレにはこの指定は入ってないので忘れず書いてください。

---
title: "You Are Fool"
author: "Hiroaki Yutani"
date: "2015/4/1"
output: html_document

layout: post
---

で、いよいよページを生成します。

servr::jekyll(serve = FALSE, input = "_source", output = "_posts")

次のファイルができているはずです。

  • figure/unnamed-chunk-X-X.png(画像があれば)
  • _posts/2015-04-01-you-fool.md
  • _site/XXX/2015/04/01/you-fool.html

これを、レポジトリにpushします。

git push origin

これでGithub Pagesにページが生成されているはずです。

yutannihilation.github.io

もうちょっといろいろ手をいれないと使えなそうですけど、とりあえずメモ。