🤠

RからZenn投稿用のMarkdownファイルを出力する

2023/05/22に公開
変更履歴

2023/5/22 初版
2023年5月に行った作業のメモをもとに整理したものです。それぞれの環境によって違いがあるかもしれませんが,ご容赦ください。

できるようになること

Zennに投稿するためのMarkdownファイル(.md)をRから作成できるようになります。

ここではRScript(.R)からmdファイルを作成する方法を紹介します。これにより,(チャンクの設定を考えずに)Rコードを試行しながら作成したものを(あとで整形して)直接出力できます。

本文を書きながらRコードを入れる場合にははじめからRMarkdown(.Rmd)ではじめるほうが楽かもしれません。(参考になるサイトが多いとか,最新のRStudioではVisualタブに切り替えることでプレビューしながら作成できる利点もあります)。

前提

ZennとGitHubリポジトリとを連携させ,MarkdownファイルをZennに投稿できるように準備しておいてください。

https://zenn.dev/carook/articles/carook-zenn-first-install

RとRStudioのインストールについては以下を参考にしてください。

https://www.kkaneko.jp/tools/win/rinstall.html

https://okumuralab.org/~okumura/stat/R-win.html

なお,パッケージのインストールが必要になる場合があります。特別に作業が必要なものは(自分で何をしたかを概ね把握しているので)説明を書こうと思いますが,CRANからダウンロードできるものは十分に把握できていないまま入っているものもあるので,ページ最下部のsessionInfo()の出力を参考にしてもらえればと思います。

R Markdownについて

Rによる分析とレポートの作成を1つのファイルで行うツールです。rmarkdownパッケージをインストールしておいてください。

詳しくは以下のガイドブックを参考にしてください。

https://bookdown.org/yihui/rmarkdown/

少し古い(1年前ぐらいの情報)ですが,日本語訳もあります。

https://gedevan-aleksizde.github.io/rmarkdown-cookbook/

その他,参考になりそうなサイトには以下のものがあります。

https://rmd4sci.njtierney.com/

https://kazutan.github.io/kazutanR/Rmd_intro.html

https://carpentries-incubator.github.io/Reproducible-Publications-with-RStudio/

Rスクリプトからの出力

先述の通り,多くの解説はRmd形式で作成する説明が多い(ような)のですが,以下のページに紹介されているとおり,knitr::spin()によって,Rスクリプトファイル(.R)からRmdファイルを作成できます。

https://deanattali.com/2015/03/24/knitrs-best-hidden-gem-spin/

実際の手順としては,rmarkdown::render()によって,Rスクリプトファイルから直接Markdownファイルを出力できます。

rmarkdown::render(input, 
                  output_format=rmarkdown::md_document(
                    variant="gfm", 
                    preserve_yaml=TRUE, 
                    pandoc_args = "--wrap=none"), 
                  output_dir)

inputはRスクリプトファイル,output_dirはGitHubローカルリポジトリのarticlesフォルダを指定します。pandoc_argsの設定はMarkdownに出力した際に意図しない改行を防ぐための設定です。これにより半角スペースによる意図しない改行を防ぐことはできますが,Rスクリプトファイルの作成の際には後で触れるように注意した方がよいことがあります。

内部では最初にspin()でRからRmdへ変換,次いでknit()による処理とPandocによる変換が行われています。render()clean=Fとすることで処理中に作成されるファイルを確認することもできます(rmarkdownパッケージで楽々ドキュメント生成参照)。

なお,YAMLヘッダーに出力形式(output: md_document)を入力すると,RStudioのソースパネルにあるCompile ReportというボタンをクリックすることでMarkdownファイルを出力できます[1]

Rスクリプトファイルを作成する

RスクリプトファイルをUTF-8で作成します。主な記載のルールは以下の通りです。

  • Roxygenコメント(#')から始まる行に,YAMLヘッダーとRコード以外の本文を記載します。Markdown記法を利用可能です。
  • #+で始まる行はknitrのチャックヘッダとして扱われます。
  • {{ code }}で囲まれたRコードはインラインRコードとして扱われます。
  • /**/の間は無視されます(RStudio画面ではエラーが表示されますが気にしないでください)

YAMLヘッダーの作成

ZennではYAML(ヤムル)ヘッダーで記事のタイトルや公開有無などを設定します。Rスクリプトファイルの最初にZennで求められる項目を記載すればOK。render()にあるpreserve_yaml=TRUEで出力されます。

Rチャンクの設定

Rコードは何も考えずに書いていけます(これがRスクリプトファイルで作成する利点)。ただし,出力時の設定はチャンクヘッダに記載する必要があります。設定できる内容はhttps://yihui.org/knitr/options/で確認できます。よく使うものとしては,echo=Fでコードは実行されるが非表示,eval=Fでコードは表示されるが実行されない,include=Fでコードは実行されるが出力に含まれない,message=Fでパッケージ読み込む時に表示されるメッセージを表示させないなどがあります。

summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00

インラインRコードも使えます。例えば円周率 \pi3.1415927 と表示されます。

図の出力

図は画像で作成されます。md_document()devでグラフィックデバイスを設定でき,標準はpngです。設定できる種類はhttps://bookdown.org/yihui/rmarkdown-cookbook/graphical-device.htmlで確認してください。

ZennではGitHubリポジトリで管理されている画像をアップロードできます。GitHubリポジトリ連携で画像をアップロードする方法にあるとおり,画像ファイルはリポジトリ配下の/imagesディレクトリに配置し,/images/から始まる絶対パスを指定します。現在,登録できる種類はpngjpgjpeggifwebpです。

ところが,Rスクリプトファイルで何も設定せずに図を出力すると,ファイル名_files/figure_gfmフォルダに画像が保存されるので,Zennへの投稿時に手動で画像を動かして,パスを変える必要があり,不便です。 knitでは以下のページにあるとおり,図の出力先はbase.dir+fig.pathで,パスはbase.url+fig.pathで指定されるので,Zennへの投稿にあわせて変更します。

https://www.randigriffin.com/2017/04/25/how-to-knit-for-mysite.html

https://jessecambon.github.io/2020/03/22/deploying-rmarkdown-online.html

具体的には以下のコードをRスクリプトファイルに記載します。チャンク名はglobal_optionsとしておくとよいと思います。

r_filename <- stringr::str_remove(knitr::current_input(), "\\.spin.Rmd")
knitr::opts_knit$set(base.dir="GitHubローカルリポジトリのルートフォルダ", base.url="/")
knitr::opts_chunk$set(fig.path = stringr::str_c("images/", r_filename,"/", sep=""))

/images/ファイル名フォルダに図の画像が保存され,mdファイルには![](/images/ファイル名/チャンク名-1.png)(/images/ファイル名/チャンク名-1.png)と表示されます。

plot(pressure, col="red")

ggplot2のグラフも同じように作成・表示できます。

library(ggplot2)
ggplot(diamonds) + 
  geom_point(aes(x = carat, y = price, color = color))

私のやりかた

ここからは,現時点での私のやり方を紹介しておきます。それぞれの環境によって方法は変わると思われるので,最適な方法を模索していただければと思います。

mdファイルに出力する

mdファイルへの出力は作成したRスクリプトファイルは別に以下のRスクリプトファイルを用意して実行しています。なお,RStudioの起動の際に,Rスクリプトファイルをクリックして起動させると,hereパッケージのhere()がRスクリプトのあるフォルダを出力してくれます(プロジェクトを作成する方が良さそうですが,そこまで大規模なものではないので)。

inputdir <- here::here() 
outputdir <- "GitHubローカルリポジトリのルートフォルダ"
inputfile <- "出力するRスクリプトファイル.R"

img_dir <- fs::path(outputdir, "images", fs::path_ext_remove(inputfile))

if(fs::is_dir(img_dir)) fs::dir_delete(img_dir) #画像ファイルがあればいったん削除

rmarkdown::render(inputfile, 
                  output_dir=fs::path(outputdir,"articles"),clean=T,
                  rmarkdown::md_document(variant="gfm", preserve_yaml=TRUE, pandoc_args = "--wrap=none" )) 

テンプレートを作成する

RStudioでは,Rスクリプトのテンプレートとしてsnippet(スニペット)を設定できます。YAMLヘッダーやglobal_optionsをスニペットとして登録しておくと,毎回の入力作業が楽になると思います。

Tools>Global OptionsでOptions画面を開き,Code>Editingの下の方にあるEnable code snippetsにチェックを入れます。その横にあるEdit snippetsボタンをクリックするとスニペットの入力画面が表示されるので,既に入力されているものを参考に入力してみてください(インデントはタブで入力してください)。

Rスクリプトファイルを新規作成して,上記のsnippet [スニペット名]で入力したスニペット名+tabキーで入力できるようになります。


Session info
sessionInfo()
## R version 4.3.0 (2023-04-21 ucrt)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 19045)
## 
## Matrix products: default
## 
## 
## locale:
## [1] LC_COLLATE=Japanese_Japan.utf8  LC_CTYPE=Japanese_Japan.utf8   
## [3] LC_MONETARY=Japanese_Japan.utf8 LC_NUMERIC=C                   
## [5] LC_TIME=Japanese_Japan.utf8    
## 
## time zone: Etc/GMT-9
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods  
## [7] base     
## 
## other attached packages:
## [1] ggplot2_3.4.2
## 
## loaded via a namespace (and not attached):
##  [1] gtable_0.3.3      dplyr_1.1.2       compiler_4.3.0   
##  [4] highr_0.10        tidyselect_1.2.0  stringr_1.5.0    
##  [7] scales_1.2.1      yaml_2.3.7        fastmap_1.1.1    
## [10] here_1.0.1        R6_2.5.1          labeling_0.4.2   
## [13] generics_0.1.3    knitr_1.42        tibble_3.2.1     
## [16] munsell_0.5.0     rprojroot_2.0.3   pillar_1.9.0     
## [19] rlang_1.1.1       utf8_1.2.3        stringi_1.7.12   
## [22] xfun_0.39         fs_1.6.2          viridisLite_0.4.2
## [25] cli_3.6.1         withr_2.5.0       magrittr_2.0.3   
## [28] digest_0.6.31     grid_4.3.0        rstudioapi_0.14  
## [31] lifecycle_1.0.3   vctrs_0.6.2       evaluate_0.21    
## [34] glue_1.6.2        farver_2.1.1      fansi_1.0.4      
## [37] colorspace_2.1-0  rmarkdown_2.21    tools_4.3.0      
## [40] pkgconfig_2.0.3   htmltools_0.5.5
脚注
  1. 細かい設定もできるようですが,出力フォルダの設定方法が私には分かりませんでした。 ↩︎

Discussion