Programmatically creating Markdown tables in R with KnitR

前端 未结 8 1691
梦谈多话
梦谈多话 2020-11-29 15:25

I am just starting to learn about KnitR and the use of Markdown in generating R documents and reports. This looks to be perfect for a lot of the day to day reporting that I

相关标签:
8条回答
  • 2020-11-29 15:57

    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 Rscript
    
    library(knitr)
    library(markdown)
    
    knit("file.Rmd")
    markdownToHTML("file.md","file.html",stylesheet="~/custom.css")
    

    Next, create the actual Markdown file:

    FILE: file.Rmd
    Report 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.css
    body {
      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!

    0 讨论(0)
  • 2020-11-29 15:58

    It is not very hard to make your own customized function. Here is a very simple proof of concept to generate an rmarkdown table of a data.frame:

       rmarkdownTable <- function(df){
          cat(paste(names(df), collapse = "|"))
          cat("\n")
          cat(paste(rep("-", ncol(df)), collapse = "|"))
          cat("\n")
    
          for(i in 1:nrow(df)){
            cat(paste(df[i,], collapse = "|"))
            cat("\n")
            }
        invisible(NULL)
        }
    

    In .Rmd document you would then use the function with results = 'asis':

    ```{r, results = 'asis'}
    rmarkdownTable <- function(df){
      cat(paste(names(df), collapse = "|"))
      cat("\n")
      cat(paste(rep("-", ncol(df)), collapse = "|"))
      cat("\n")
    
      for(i in 1:nrow(df)){
        cat(paste(df[i,], collapse = "|"))
        cat("\n")
        }
    invisible(NULL)
    }
    
    rmarkdownTable(head(iris))
    ```
    

    The code above would give you the following figure (in the example this is the pdf output, but since the table is in markdwon, you could knit into html or word too).

    enter image description here From here - and reading other people´s code - you can figure out how to manipulate the text to generate the table you want and create more personalized functions.

    0 讨论(0)
提交回复
热议问题