Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
This script builds on Aleszu Bajak's excellent [tutorial on building a course website using R Markdown and Github pages]( It automates the rendering of HTML files from RMD and automatically generates the page menu for the site, eliminating much duplicative work.
# This script builds on Aleszu Bajak's excellent
# [tutorial on building a course website using R Markdown and Github pages](
# I was excited about the concept but wanted to automate a few of the production steps: namely generating the HTML files
# for the site from the RMD pages (which Aleszu describes doing one-by-one) and generating the site navigation menu,
# which Aleszu handcodes in the `_site.yml` file. This script should automate both processes, though it may have some quirks
# unique to my setup that you'd want to tweak to fit your own. It's likely more loquacious than necessary as well, so feel free
# to condense as you can. Ideally, each time you make updates to your RMD files you can run this script to generate updated HTML
# pages and a new `_site.yml`. Then commit changes to Github and you're up and running!
# Once you've got everything configured for your own site below, you should be able to run `source('renderSite.R')`
# in your console to generate updated HTML files and an updated menu. You could probably add some Github code to the
# very end to build the commit into the script.
#list all the RMD files in your site's directory
files <- list.files(path = ".", pattern = '*.Rmd', full.names = FALSE)
#this function runs over all the RMD files and renders them to their default output (hopeful HTML)
lapply(files, function(x) {
# here I set a few variables for the course that I can paste into the strings below
courseTitle <- "Your Course Title Here"
navTitle <- "Your Navigation Title Here"
profName <- "Your Name"
profEmail <- "Your Email Address"
# this generates a list of the HTML files created in lines 8-10
html_files <- list.files(path = ".", pattern = '*.html', full.names = FALSE)
# the code below works through the listed HTML files and generates a list of strings, formatted as required in the
# `_site.yml` file, that includes each of the site's pages and URLs. It generates the page name in upper case but you could
# tweak that as desired. This does name the pages based on their HTML filenames; if you wanted something more
# descriptive you'd have to write some more code here.
pages <- lapply(html_files, function(x) {
pageName <- sub('\\.html$', '', x)
paste0(' - text: \"',paste(toupper(substr(pageName, 1, 1)), substr(pageName, 2, nchar(pageName)), sep=""),'\"\n',
' href: ',pageName,'.html','\n')
# these collapse the list into a single string. This also renames the "Index" menu item as "Description."
# I put my course description in the `index.html` file so it's the first thing that loads with the site,
# but I think calling the page "Index" in the site menu would be confusing for students. If there were other pages you
# knew you'd want to rename consistently every time you generated the site, you could use the `sub` function to do so.
pages <- paste(pages, collapse = "")
pages <- sub("Index","Description", pages)
# this pastes the standard boilerplate from the top of the `_site.yml` file together with the list of pages
# generated above. This also adds a final menu item with a link to email the professor established in the variables above.
yml <- paste0('name: ',courseTitle,'\n',
'output_dir: \".\"','\n',
' title: \"',navTitle,'\"','\n',
' left:','\n',
' - text: \"Email Prof. ',profName,'\"\n',
' href: mailto:',profEmail)
# finally, this writes everything generated above into (what should be) a valid `_site.yml` file.
# Commit the folder to github and everything should be updated!
write(yml, file="_site.yml")

This comment has been minimized.

Copy link

shawngraham commented Aug 27, 2017

This is great. Playing around with it, I found that adding something like

     toc: true
     toc_depth: 2
     toc_float: true
     theme: cosmo

to each Rmd file made for nice output.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.