This vignette demonstrates how load the lemon package
automatically enables pretty printing of data frames with knitr’s
kable.
The beauty of defining the function
knit_print.data.frame is that when working with R Notebooks
in R, the editor can output the data frame dynamically, while ensuring
that the knitted document also has the
First we load some data and show the top.
##            Murder Assault UrbanPop Rape
## Alabama      13.2     236       58 21.2
## Alaska       10.0     263       48 44.5
## Arizona       8.1     294       80 31.0
## Arkansas      8.8     190       50 19.5
## California    9.0     276       91 40.6
## Colorado      7.9     204       78 38.7Now load lemon and set the lemon_print
functions.
The same view is now nicely printed!
```{r caption="Data frame is now printed using `kable`.",render=lemon_print}
head(USArrests)
```| Murder | Assault | UrbanPop | Rape | |
|---|---|---|---|---|
| Alabama | 13.2 | 236 | 58 | 21.2 | 
| Alaska | 10.0 | 263 | 48 | 44.5 | 
| Arizona | 8.1 | 294 | 80 | 31.0 | 
| Arkansas | 8.8 | 190 | 50 | 19.5 | 
| California | 9.0 | 276 | 91 | 40.6 | 
| Colorado | 7.9 | 204 | 78 | 38.7 | 
Notice how we specified kable arguments directly as
chunk-options.
knitr uses a S3 generic function, knit_print, to print
objects. Method dispatching in
R means that by defining a function, say
knit_print.data.frame, calling knit_print(df)
will call our function if df was a data frame.
To have knitr use our function when outputting a data frame, we
define the function knit_print.data.frame (and similar for
data frames passed through dplyr functions, i.e tbl_df and
grouped_df).
Disabling the function is by usual chunk options,
render = normal_print. check ?knit_print.
Disabling the functions.
```{r normal_print,render=normal_print}
head(USArrests)
```##            Murder Assault UrbanPop Rape
## Alabama      13.2     236       58 21.2
## Alaska       10.0     263       48 44.5
## Arizona       8.1     294       80 31.0
## Arkansas      8.8     190       50 19.5
## California    9.0     276       91 40.6
## Colorado      7.9     204       78 38.7You can still ask for kable.
```{r results='asis',render=normal_print}
kable(head(USArrests),caption='Normal `kable` usage.')
```| Murder | Assault | UrbanPop | Rape | |
|---|---|---|---|---|
| Alabama | 13.2 | 236 | 58 | 21.2 | 
| Alaska | 10.0 | 263 | 48 | 44.5 | 
| Arizona | 8.1 | 294 | 80 | 31.0 | 
| Arkansas | 8.8 | 190 | 50 | 19.5 | 
| California | 9.0 | 276 | 91 | 40.6 | 
| Colorado | 7.9 | 204 | 78 | 38.7 | 
We have mentioned kable a couple of times. That is
because the lemon_print for data frames uses
kable of the knitr package.
Some common arguments:
caption: Table caption. See examples in
demonstration.align: Vector of column alignments with
'l', 'c', and 'r'. Or, a single
element, i.e. c('c','l','r') = 'clr').row.names: A logical value indicating whether to
include row names.col.names: A character vector of column names to be
used in the table.The second code block, when edited in RStudio, would look like this:
 And, as
demonstrated, the rendered document has the data frame printed
nicely.
If we do not wish this behaviour, but still use
kable,
| Murder | Assault | UrbanPop | Rape | |
|---|---|---|---|---|
| Alabama | 13.2 | 236 | 58 | 21.2 | 
| Alaska | 10.0 | 263 | 48 | 44.5 | 
| Arizona | 8.1 | 294 | 80 | 31.0 | 
| Arkansas | 8.8 | 190 | 50 | 19.5 | 
| California | 9.0 | 276 | 91 | 40.6 | 
| Colorado | 7.9 | 204 | 78 | 38.7 | 
RStudio would look like this: 
Summaries are nicely formatted, but these require setting the S3
method for table.
```{r kable.opts=list(caption='Summary tables are printed with some default options.')}
knit_print.table <- lemon_print
summary(USArrests)
```| Murder | Assault | UrbanPop | Rape | 
|---|---|---|---|
| Min. : 0.800 | Min. : 45.0 | Min. :32.00 | Min. : 7.30 | 
| 1st Qu.: 4.075 | 1st Qu.:109.0 | 1st Qu.:54.50 | 1st Qu.:15.07 | 
| Median : 7.250 | Median :159.0 | Median :66.00 | Median :20.10 | 
| Mean : 7.788 | Mean :170.8 | Mean :65.54 | Mean :21.23 | 
| 3rd Qu.:11.250 | 3rd Qu.:249.0 | 3rd Qu.:77.75 | 3rd Qu.:26.18 | 
| Max. :17.400 | Max. :337.0 | Max. :91.00 | Max. :46.00 | 
Cross-tabulations are however not nicely formatted.
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1##    gear
## cyl  3 4 5
##   4  1 8 2
##   6  2 4 1
##   8 12 0 2## 
## Attaching package: 'dplyr'## The following object is masked from 'package:gridExtra':
## 
##     combine## The following objects are masked from 'package:stats':
## 
##     filter, lag## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union```{r dplyr,kable.opts=list(caption='Also works on `dplyr` objects.')}
mtcars %>% group_by(cyl) %>% summarise(mean(disp))
```| cyl | mean(disp) | 
|---|---|
| 4 | 105.1364 | 
| 6 | 183.3143 | 
| 8 | 353.1000 |