Quicker knitr kables in RStudio notebook
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
The setup
The RStudio notebook is a great interactive tool to build a statistical report. Being able to see statistics and graphs right on the fly probably has saved me countless hours, especially when building complex reports.
However, one thing that has always bothered me was the way tables are displayed in the notebook with knitr’s kable
function. For example, consider the airquality
data set:
head(airquality) ## Ozone Solar.R Wind Temp Month Day ## 1 41 190 7.4 67 5 1 ## 2 36 118 8.0 72 5 2 ## 3 12 149 12.6 74 5 3 ## 4 18 313 11.5 62 5 4 ## 5 NA NA 14.3 56 5 5 ## 6 28 NA 14.9 66 5 6
To get a nice table in your report you type
knitr::kable(head(airquality), caption = "New York Air Quality Measurements.")
which shows up nicely formatted in the final output
Ozone | Solar.R | Wind | Temp | Month | Day |
---|---|---|---|---|---|
41 | 190 | 7.4 | 67 | 5 | 1 |
36 | 118 | 8.0 | 72 | 5 | 2 |
12 | 149 | 12.6 | 74 | 5 | 3 |
18 | 313 | 11.5 | 62 | 5 | 4 |
NA | NA | 14.3 | 56 | 5 | 5 |
28 | NA | 14.9 | 66 | 5 | 6 |
The problem
But in the interactive RStudio notebook session the table looks something like the following:
So first of all, the formatting is not that great. Secondly, the table chunk consumes way too much space of the notebook and, at times, can be very cumbersome to scroll. Also for bigger tables (and depending on your hardware) it can take up to a few seconds for the table to be built.
So often when I was using kable
, I felt my workflow being disrupted. In the interactive session I want a table being built quickly and in a clean format. Now, using the simple print
function you’ll get exactly this
So my initial quick-and-dirty workaround during the interactive session was to comment out the knitr
statement and use the print function.
#knitr::kable(head(airquality), caption = "New York Air Quality Measurements.") print(head(airquality))
Then, only when creating the final report, I would comment out the print
function and use kable
again. Of course, there is a much more elegant and easier solution to get this without having to switch between functions.
The solution
We define a simple wrapper, which chooses the corresponding function depending on the context:
kable_if <- function(x, ...) if (interactive()) print(x, ...) else knitr::kable(x, ...)
Then you simply call it as you would invoke kable
and now you get both, the quick table in the interactive session …
… and a formatted table in the report.
kable_if(head(airquality), caption = "New York Air Quality Measurements.")
Ozone | Solar.R | Wind | Temp | Month | Day |
---|---|---|---|---|---|
41 | 190 | 7.4 | 67 | 5 | 1 |
36 | 118 | 8.0 | 72 | 5 | 2 |
12 | 149 | 12.6 | 74 | 5 | 3 |
18 | 313 | 11.5 | 62 | 5 | 4 |
NA | NA | 14.3 | 56 | 5 | 5 |
28 | NA | 14.9 | 66 | 5 | 6 |
That’s it. Simply put this function definition somewhere in the top of your document and enjoy a quick workflow.
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.