【R】flexdashboardをGithubにdeploy
1. はじめに
GithubにはGithub Pages という機能があり、無料でWebsiteを構築できます。Rコミュニティでは広く使われているようで、様々なR markdownフォーマット(pkgdown, blogdown, bookdown)で活用されています。最近知ったのは、flexdashboardをdeployできるということで、試してみました。
Deploying flexdashboard on Github Pagesのページが非常にわかりやすかったので、こちらを参考にしました。
2. 必要なもの
最低限必要なものは、下記4点です。
・Githubレポジトリ
・flexdashboard, rmarkdownパッケージ
・flexdashboardファイル(*.rmd)
・_site.yml
ファイル
3. 作ってみる
3.1 レポジトリ
まずは、レポジトリの設定です。新しくレポジトリを作ります。名前を設定して[create repository]ボタンを押します。
3.2 ローカルフォルダの作成
githubのorigin
にsyncさせるフォルダを作ります。RStudioにて、
[File] -> [New Projuect] -> [New Directory] -> [New Project]で新しいプロジェクトを作ります。今回は、irisデータを使ったDashboardにしますので「flexdashboard_iris」としました。
3.3 _site.ymlファイルの作成
同じくRStudioにて、ファイルを作成します。
[File] -> [New File] -> [Text File]にて、新しいテキストファイルを作ります。通常は、GithubPageはdocs
フォルダ内のデータをレンダリングするので、それをしています。下記の内容をテキストファイルにコピーします(最後に改行がないとErrorとなりました)。
name: "flexdashboard_iris"
output_dir: docs
ファイル名を、_site.yml
として保存します。_site.yml
ファイルについての詳細は、こちら。
3.4 flexdashboardファイルの準備
今回はtemplateを基にrmdファイルを作ります。
[File] -> [New File] -> [R Markdown]を選び、ダイアログから[From Template]を選択。[Flex Dashboard]を選んで[OK]を押します。内容を編集して、下記の通りとしました。
--- title: "Iris" output: flexdashboard::flex_dashboard: orientation: rows vertical_layout: fill date: "`r Sys.Date()`" runitime: shiny --- <style> .navbar { background-color: #53e055; border-color: #53e055 } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { background-color: #ed8218; color: white; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { color: white; background-color: #ed8218; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { background-color: #ed8218; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { border-color: #ed8218; } </style> ```{r setup, include=FALSE} library(flexdashboard) library(knitr) library(shiny) library(tidyverse) ``` Analysis ===================================== Row ------------------------------------------------------------------------- ### Iris measured ```{r n_iris} n_iris <- nrow(iris) valueBox(n_iris, icon = "fa-pencil", color = "#fa7404") ``` ------------------------------------------------------------------------- ### Average sepal length ```{r sepal_length} sepal_length <- paste0(round(mean(iris$Sepal.Length, na.rm = TRUE)), " mm") valueBox(sepal_length, icon = "fa-ruler", color = "#fa7404") ``` ### Average sepal width ```{r sepal_width} sepal_width <- paste0(round(mean(iris$Sepal.Width, na.rm = TRUE)), " mm") valueBox(sepal_width, icon = "fa-ruler", color = "#fa7404") ``` ### Average petal length ```{r petal_length} petal_length <- paste0(round(mean(iris$Petal.Length, na.rm = TRUE)), " mm") valueBox(petal_length, icon = "fa-ruler", color = "#fa7404") ``` ### Average petal width ```{r petal_width} petal_width <- paste0(round(mean(iris$Petal.Width, na.rm = TRUE)), " mm") valueBox(petal_width, icon = "fa-ruler", color = "#fa7404") ``` Row ------------------------------------- ### Sepal Length vs. Petal Length ```{r plot, echo = FALSE} library(plotly) length_plot <- ggplot(iris, aes(iris$Sepal.Length, iris$Petal.Length)) + geom_point(aes(color = Species), size = 3, alpha = 0.8) + theme_minimal() + scale_color_manual(values = c("darkorange","purple","cyan4")) + labs(x = "Sepal length [mm]", y = "Petal length [mm]", color = "Iris species") ggplotly(length_plot) ``` Column --------------------------------------- ### Histogram of iris sepal width ```{r iris_sepal_hist, echo = FALSE} ggplot(iris, aes(iris$Sepal.Width)) + geom_histogram(aes(fill = Species), alpha = 0.5, position = "identity") + scale_color_manual(values = c("darkorange","purple","cyan4")) + theme_minimal() + labs(x = "Sepal width [mm]", y = "Frequency", title = "Iris Sepal Width") ``` --------------------------------------- ### Histogram of iris petal width ```{r iris_petal_hist, echo = FALSE} ggplot(iris, aes(iris$Petal.Width)) + geom_histogram(aes(fill = Species), alpha = 0.5, position = "identity") + scale_color_manual(values = c("darkorange","purple","cyan4")) + theme_minimal() + labs(x = "Petal width [mm]", y = "Frequency", title = "Iris Petal Width") ``` Raw Data ===================================== Row ------------------------------------- ### Data Table of Raw Data ```{r table} DT::datatable(iris, options = list( pageLength = 25, height = "600px" )) ``` Row {data-height=100} ------------------------------------- ```{r download} library(shiny) fluidRow( downloadHandler(filename = function() { return("iris.csv") }, content = function(file) { write.csv(iris, file) }) ) ```
このファイルをindex.rmd
という名前を保存します。ここが重要で、websiteとして表示するには、この名前である必要があります。
これで、レンダリングの準備ができました。knit
すると、次のようにDashboardが表示されます。RStudioのファイルを見ると、_site.yml
で指定したように、docsフォルダができています。
3.5 GithubとSync
最後に、Websiteとして表示させるためにローカルフォルダとレポジトリのorigin
とsyncさせます。
僕は、PortableGitを使用しているのですが、このターミナルから、プロジェクトのあるフォルダに移動して、以下のコマンドでフォルダの内容をコミットします。
git init
git add *
git commit -m "init commit"
git branch -M master
git branch -M master
git remote add origin git@github.com:DiNOV-Tokyo/flexdashboard_iris.git
git push -u origin master
さあ、問題がなければこれで完成です。最後に一仕事。
3.6 Github pageの設定
最後の一仕事は、Githubにて、[settings] -> [options] -> [Github page]にて、branchをmaster
にして、フォルダをdocs
に変更します。
最後に、[Save]ボタンを押します。これで、flexdashboardが
https://Your_Github_User_Name.github.io/Repository_Name
にて表示されます。僕の場合は、
https://dinov-tokyo.github.io/flexdashboard_iris/
です。
4. さいごに
GithubでDashboardを動かせるとは(しかも無料で)知らなかったので、新しい発見でした。これなら、気軽にいろいろ作ってみてもよさそうです。