というわけで,もうちょっと覗き込みます
renderは,だいたいこういう処理をしています:
output_format
を参照し,その度にすべき処理内容を持ってくる
output_format
については後述なお,runtime(shinyまわり)や細かいところについては省略します
knitr::spin()
で*.rファイルを処理rmarkdown::yaml_front_matter
を利用output_format
にあるpost-knitを読み込んで準備knitr::knit()
output_format
よりpre_processorをextra_argsへ取り出すoutput_format$pandoc
に統合してきた内容を利用してconvert
output_format
に格納されているpost_processorを呼び出すoutput created
となる…です
output_format
を常に参照してるこの3つをおさえておけば(今日の話は)OKです
主なものは以下の通りです:
html_document
などNULL
output_format
を出力html_document
pdf_document
revealjs::revealjs_presentation
etc…Rmdのソースコード埋め込み用処理の関数
source_code <- NULL
source_file <- NULL
pre_knit <- function(input, ...) {
if (code_download) {
source_file <<- basename(input)
source_code <<- paste0(
'<div id="rmd-source-code">',
base64enc::base64encode(input),
'</div>')
}
}
post_knit <- function(metadata, input_file, runtime, encoding, ...) {
# extra args
args <- c()
# navbar (requires theme)
if (!is.null(theme)) {
# add navbar to includes if necessary
navbar <- file.path(normalize_path(dirname(input_file)), "_navbar.html")
# if there is no _navbar.html look for a _navbar.yml
if (!file.exists(navbar)) {
navbar_yaml <- file.path(dirname(navbar), "_navbar.yml")
if (file.exists(navbar_yaml))
navbar <- navbar_html_from_yaml(navbar_yaml)
# if there is no _navbar.yml then look in site config (if we have it)
config <- site_config(input_file, encoding)
if (!is.null(config) && !is.null(config$navbar))
navbar <- navbar_html(config$navbar)
}
(以下略)
コード埋め込みとDLまわりの処理(っぽい)など
pre_processor <- function(metadata, input_file, runtime, knit_meta, files_dir,
output_dir) {
(中略)
# code_folding
if (code_folding %in% c("show", "hide")) {
# must have a theme
if (is.null(theme))
stop("You must use a theme when specifying the 'code_folding' option")
args <- c(args, pandoc_variable_arg("code_folding", code_folding))
code_menu <- TRUE
}
# source_embed
if (code_download) {
if (is.null(theme))
stop("You must use a theme when specifying the 'code_download' option")
args <- c(args, pandoc_variable_arg("source_embed", source_file))
sourceCodeFile <- tempfile(fileext = ".html")
writeLines(source_code, sourceCodeFile)
args <- c(args, pandoc_include_args(after_body = sourceCodeFile))
code_menu <- TRUE
}
(以下略)
Pandocで使用するhtmlテンプレファイルへのパスを設定
# template path and assets
if (identical(template, "default"))
args <- c(args, "--template",
pandoc_path_arg(rmarkdown_system_file("rmd/h/default.html")))
else if (!is.null(template))
args <- c(args, "--template", pandoc_path_arg(template))
引数で取得した内容をpandocのargsへひたすら追加(以下は一部抜粋)
# additional css
for (css_file in css)
args <- c(args, "--css", pandoc_path_arg(css_file))
# return format
output_format(
knitr = knitr_options_html(fig_width, fig_height, fig_retina, keep_md, dev),
pandoc = pandoc_options(to = "html",
from = from_rmarkdown(fig_caption, md_extensions),
args = args),
keep_md = keep_md,
clean_supporting = self_contained,
df_print = df_print,
pre_knit = pre_knit,
post_knit = post_knit,
pre_processor = pre_processor,
on_exit = on_exit,
base_format = html_document_base(smart = smart, theme = theme,
self_contained = self_contained,
lib_dir = lib_dir, mathjax = mathjax,
template = template,
pandoc_args = pandoc_args,
extra_dependencies = extra_dependencies,
...)
)
html_document
などを流用すると楽
html_document_base
が便利output_format
を自分好みにアレンジできればOK
includes
で追加css
を指定pandoc_args
で調整以下の公式ドキュメントを参照してください: Document Templates - R Markdown
例えば,こんな感じです:
quarterly_report <- function(toc = TRUE) {
# get the locations of resource files located within the package
css <- system.file("reports/styles.css", package = "mypackage")
header <- system.file("reports/quarterly/header.html", package = "mypackage")
# call the base html_document function
rmarkdown::html_document(toc = toc,
fig_width = 6.5,
fig_height = 4,
theme = NULL,
css = css,
includes = includes(before_body = header))
}
フルカスタマイズする場合です.以下の手順となります:
以下のディレクトリを設置
inst/rmarkdown/templates/(出力形式の関数名)/
例えば,fullpagejs;;fullpagejs_slide
の場合,
inst/rmarkdown/templetes/fullpagejs_slide/
以下の場所にtemplete.yaml
を準備:
inst/rmarkdown/templetes/fullpagejs_slide/templete.yaml
例えば,こんな内容です:
name: fullPage.js slide (HTML)
description: >
HTML slide based on fullPage.js.
create_dir: false
以下の場所にskeleton.Rmd
を設置
inst/rmarkdown/templetes/fullpagejs_slide/skeleton/skeleton.Rmd
これは,新規Rmd作成でTempleteから生成する際に持ってきます.例えばこんな感じです:
---
title: "Untitled"
output: fullpagejs::fullpagejs_slide
---
# hogehoge
hogehogehoge.
# R chunk test
output test.
例えばdefault.html
というファイル名にしたければ,以下のように設置:
inst/rmarkdown/templetes/fullpagejs_slide/resources/default.html
このファイル内容については,pandocのテンプレートに対する知識が必要です.たとえばこんな感じです:
<!DOCTYPE html>
<html$if(lang)$ lang="$lang$"$endif$$if(dir)$ dir="$dir$"$endif$>
<head>
<title>$if(title-prefix)$$title-prefix$ – $endif$$pagetitle$</title>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="$fullpagejs-path$/jquery.fullPage.css" />
(以下略)
inst/
以下に設置していきます
例えばfullpage.jsというjsライブラリを利用したい場合:
inst/fullPage.js-2.9.4/(ライブラリの中身)
これを呼び出すときは,pandocにこんな感じで書き込む;
<script type="text/javascript" src="$fullpagejs-path$/jquery.fullPage.js"></script>
んでpre_processorにこんな感じで:
# fullpage.js
fullpagejs_path <- system.file("fullPage.js-2.9.4", package = "fullpagejs")
if (!self_contained || identical(.Platform$OS.type, "windows"))
fullpagejs_path <- relative_to(
output_dir, render_supporting_files(fullpagejs_path, lib_dir))
else
fullpagejs_path <- pandoc_path_arg(fullpagejs_path)
args <- c(args, "--variable", paste0("fullpagejs-path=", fullpagejs_path))
他のRパッケージ同様,R/
ディレクトリ内に関数を記述したRスクリプトファイルを設置してください
それぞれで確認してください.
以上です.
R Markdownのベースはこんな感じ:
こないだ,R Markdownの新しいテンプレ作りました:
解説用スライドは以下:
まだ作ったばかりなので改良したいのですが,時間がなくて… だれか一緒に作りませんか?