Knit directly to jupyter notebooks from RStudio

Did you know that you can completely replace the “knitting” engine in R Markdown documents? Well, you can!

Why would you want to do this? Well, in the case of this post, to commit the unpardonable sin of creating a clunky jupyter notebook from a pristine Rmd file.

I’m definitely not “a fan” of “notebook-style” interactive data science workflows (apologies to RStudio, but I don’t even like their take on the interactive notebook). However, if you work with folks who are more productive in jupyter-style environments, it can be handy to be able to move back and forth between the ipynb and Rmd formats.

The notedown module and command-line tool does just that. I came across that after seeing this notedown example. There’s a script there to do the conversion but it’s very Windows-specific and it’s a pretty manual endeavour if all you want to do is quickly generate both an ipynb file and a notebook preview html file from an Rmd you’re working on.

We can exploit the fact that you can specify a knit: parameter in the Rmd YAML header. Said parameter can be inline code or be a reference to a function in a package. When you use the “Knit” command from RStudio (button or key-cmd-shortcut) this parameter will cause the Rmd file to be passed to that function and bypass all pandoc processing. Your function has to do all the heavy lifting.

To that end, I modified my (github only for now) markdowntemplates package and added a to_jupyter() function. Provided you have jupyter setup correctly (despite what the python folk say said task is not always as easy as they’d like you to believe) and notedown installed properly, adding knit: markdowntemplates::to_jupyter to the YAML header of (in theory) any Rmd document and knitting it via RStudio will result in

  • an ipynb file being generated
  • an html file generated via nbconverting the notebook file, and
  • said HTML file being rendered in your system’s default browser

You can take this test Rmd:

knit: markdowntemplates::to_jupyter
## Notedown Test

Let's try a python block

```{r engine="python"}
def test(x):
  return x * x

And a ggplot test


We'll use an old friend


and plot it:

ggplot(mtcars, aes(wt, mpg)) + geom_point() + ggthemes::theme_fivethirtyeight()

and, after doing devtools::install_github("hrbrmstr/markdowntemplates") and ensuring you have notedown working, knit it in RStudio to generate the ipynb file and render an HTML file:

Note the python block is a fully functioning notebook cell. I haven’t tried other magic language cells, but they should work according to the notedown docs.

I’ve only performed light testing (on a MacBook Pro with jupyter running under python 3.x) and I’m sure there will be issues (it’s python, it’s jupyter and this is dark alchemy bridging those two universes), so when you run into errors, please file an issue. Also drop any feature requests to the same location.

Cover image from Data-Driven Security
Amazon Author Page

8 Comments Knit directly to jupyter notebooks from RStudio

  1. Pingback: Knit directly to jupyter notebooks from RStudio – Cyber Security

  2. Pingback: Knit directly to jupyter notebooks from RStudio - Use-R!Use-R!

  3. Pingback: Knit directly to jupyter notebooks from RStudio – Mubashir Qasim

  4. David

    I’d love to see a post on what you dislike about notebooks, specifically RStudio notebooks. While I don’t care to work in Jupyter very often, I do get a kick out of RStudio’s take on them. Getting your opinions and concerns would be helpful.

  5. Anthony LaBonde

    I’m trying to convert my Rmd file to ipynb using your procedure, but get this error. Any thoughts on a quick fix?

    Error in knit:markdowntemplates::to_jupyter : NA/NaN argument

  6. Pingback: Waffle Geoms & Other Miscellaneous In-Development Package Updates |

  7. Pingback: Waffle Geoms & Other Miscellaneous In-Development Package Updates – Data Science Austria

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.