(Semi-)automating the R markdown to blogger workflow
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
In his recent post 100 most read R posts for 2012 (stats from R-bloggers) – big data, visualization, data manipulation, and other languages Tal Galili – the guy behind R-Bloggers – presents his wishlist for 2013. Among other things he states
“The next step will be to have a “publish to your WordPress/blogger” button right from the RStudio console – allowing for the smoothest R blogging experience one could dream of.
I hope we’ll see this as early as possible in 2013.”
Given that I had some troubles myself recently with finding a convenient way of creating post for this blog (a blogspot site) and that I didn't want to wait until RStudio may integrate such functionality, I decided to come up with my own work around for the time being.
But let's start from the beginning:
What I want:
- I want to blog
- I want to blog using RStudio's R markdown framework (as it is very convenient)
- I want to have code highlighting in my posts
What I don't want:
- I don't want to manually fiddle around in the html code for each of the posts I create with RStudio
- I don't want write blog posts using the compose section on blogger
- Basically, I don't want to spend a lot of time on formatting (I rather spend the time on coding)
Why I want this:
- For starters, because I'm lazy
- Secondly, I want to integrate blogging into my teaching in the near future and for that I need a convenient and straight forward solution on how to create nice posts (after all I want to teach the students how to use R, not html)
The solution (as of now) is as follows (at least for me):
Yihui Xie has produced a SyntaxHighlighter Brush for the R Language which can be used for highlighting R code in blog posts.
In order to get the SyntaxHighlighter working on your blog, simply follow this tutorial at thebiobucket*.
However, the SyntaxHighlighter by Alex Gorbatchev, and subsequently also Yihui's brush for R, works a little different from the knitr code highlighting implementation. Basically, a chunk of code created with knitr is prepended by this little bit of html code:
<pre><code class="r"></code></p>
<p>whereas SyntaxHighlighter requires the following format for it to work:</p>
<p><code><pre class="brush: r"></code></p>
<p>In order to automate the process of adjusting the brush definition needed for code highlighting using the SyntaxHighlighter brush I created the follwing function:</p>
<pre>rmd2blogger <- function(rmdfile) {
stopifnot(require(knitr))
## knit rmdfile to <body> - only html
knit2html(rmdfile, fragment.only = TRUE)
## read knitted html file
htm.name <- gsub(".Rmd", ".html", rmdfile)
tmp <- readLines(htm.name)
## substitue important parts
tmp <- gsub("<pre><code class=\"r\">", "<pre class=\"brush: r\">", tmp)
tmp <- gsub("</code></pre>", "</pre>", tmp)
## write with .blg file ending
writeLines(tmp, paste(htm.name, ".blg", sep =""))
}
</pre>
<p><strong>This function has two important components to it:</strong></p>
<ol>
<li>it uses knitr's knit2html with <em>fragment.only</em> set to <em>TRUE</em>, which means your only creating the <code><body>
part of the html.
To use it, simply provide the path to the .Rmd file you want to publish on your blogspot.
rmd2blogger("someRmdFile.Rmd")
Now, you can simply open the .html.blg file in a text editor and copy the complete contents into the html editor for a new post on your blogger site and the code R should look like the one above.
In case you find any bugs, please let me know.
sessionInfo() ## R version 2.15.2 (2012-10-26) ## Platform: x86_64-pc-linux-gnu (64-bit) ## ## locale: ## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C ## [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 ## [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 ## [7] LC_PAPER=C LC_NAME=C ## [9] LC_ADDRESS=C LC_TELEPHONE=C ## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C ## ## attached base packages: ## [1] parallel grid stats graphics grDevices utils datasets ## [8] methods base ## ## other attached packages: ## [1] rgdal_0.7-25 raster_1.9-92 gridBase_0.4-6 ## [4] latticeExtra_0.6-19 lattice_0.20-10 RColorBrewer_1.0-5 ## [7] sp_0.9-99 knitr_0.9 ## ## loaded via a namespace (and not attached): ## [1] digest_0.6.0 evaluate_0.4.3 formatR_0.7 markdown_0.5.3 ## [5] plyr_1.7.1 stringr_0.6 tools_2.15.2
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.