Programmatically creating Markdown tables in R with KnitR Programmatically creating Markdown tables in R with KnitR r r

Programmatically creating Markdown tables in R with KnitR


Now knitr (since version 1.3) package include the kable function for a creation tables:

> library(knitr)> kable(head(iris[,1:3]), format = "markdown")|  Sepal.Length|  Sepal.Width|  Petal.Length||-------------:|------------:|-------------:||           5,1|          3,5|           1,4||           4,9|          3,0|           1,4||           4,7|          3,2|           1,3||           4,6|          3,1|           1,5||           5,0|          3,6|           1,4||           5,4|          3,9|           1,7|

UPDATED: if you get raw markdown in a document try setup results = "asis" chunk option.


Two packages that will do this are pander

library(devtools)install_github('pander', 'Rapporter')

Or ascii

pander is a slightly different approach to report construction, (but can be useful for this feature).

ascii will allow you to print with type = 'pandoc (or various other markdown flavours)

library(ascii)print(ascii(head(iris[,1:3])), type = 'pandoc')    **Sepal.Length**   **Sepal.Width**   **Petal.Length**  --- ------------------ ----------------- ------------------1   5.10               3.50              1.40              2   4.90               3.00              1.40              3   4.70               3.20              1.30              4   4.60               3.10              1.50              5   5.00               3.60              1.40              6   5.40               3.90              1.70              --- ------------------ ----------------- ------------------

Note that in both these cases, it is directed towards using pandoc to convert from markdown to your desired document type, however using style='rmarkdown' will create tables that are compatible with this markdown package and inbuilt conversion in rstudio.


Just wanted to update this with what I settled on doing. I am using the hwriter package right now to print out tables, and using the row.* and col.* features to put CSS classes on to different elements. Then, I wrote custom CSS to make my display as I wanted it. So, here's an example in case anyone else is dealing with something similar.

First, create a file that will do the knitting and change the Markdown into HTML:

FILE: file_knit.r#!/usr/bin/env Rscriptlibrary(knitr)library(markdown)knit("file.Rmd")markdownToHTML("file.md","file.html",stylesheet="~/custom.css")

Next, create the actual Markdown file:

FILE: file.RmdReport of Fruit vs. Animal Choices==================================This is a report of fruit vs. animal choices.```{r echo=FALSE,results='asis'}library(hwriter)set.seed(9850104)my.df <- data.frame(Var1=sample(x=c("Apple","Orange","Banana"),size=40,replace=TRUE),                    Var2=sample(x=c("Dog","Cat","Bunny"),size=40,replace=TRUE))tbl1 <- table(my.df$Var1,my.df$Var2)tbl1 <- cbind(tbl1,rowSums(tbl1))tbl1 <- rbind(tbl1,colSums(tbl1))colnames(tbl1)[4] <- "TOTAL"rownames(tbl1)[4] <- "TOTAL"# Because I used results='asis' for this chunk, I can just use cat() and hwrite() to # write out the table in HTML. Using hwrite()'s row.* function, I can assign classes# to the various table elements.cat(hwrite(tbl1,           border=NA,           table.class="t1",           row.class=list(c("header col_first","header col","header col","header col", "header col_last"),                          c("col_first","col","col","col","col_last"),                          c("col_first","col","col","col","col_last"),                          c("col_first","col","col","col","col_last"),                          c("footer col_first","footer col","footer col","footer col","footer col_last"))))```

Finally, just create a custom CSS file.

FILE: custom.cssbody {  font-family: sans-serif;  background-color: white;  font-size: 12px;  margin: 20px;}h1 {font-size:1.5em;}table {  border: solid;  border-color: black;  border-width: 2px;  border-collapse: collapse;  margin-bottom: 20px;  text-align: center;  padding: 0px;}.t1 .header {  color: white;  background-color: black;  border-bottom: solid;  border-color: black;  border-width: 2px;  font-weight: bold;}.t1 .footer {  border-top: solid;  border-color: black;  border-width: 2px;}.t1 .col_first {  border-right: solid;  border-color: black;  border-width: 2px;  text-align: left;  font-weight: bold;  width: 75px;}.t1 .col {  width: 50px;}.t1 .col_last {  width: 50px;  border-left: solid;  border-color: black;  border-width: 2px;}

Executing ./file_knit.r gives me file.html, which looks like this:

Example Output

So, hopefully this might be helpful to others who want a bit more formatting in Markdown output!