Embed csv in html rmarkdown

  • Example
  • Description of the problem
  • Search for solutions and
  • Question

... see sample code for rmarkdown example.

Evaluate the answers that demonstrate the solution by modifying the rmarkdown snippet.

--- title: "Reproducable Example" author: "user2030503" output: html_document --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) ``` ## Example: mtcars ```{r} write.csv2(mtcars, "./file.csv") # Code to embed mtcars as csv # Code to provide mechanism for button or link for later user interaction to open/save the csv. ``` ## Problem * I want to embed the csv file into the html generated by this rmarkdown script. * Embedding here means, that the csv data are integral part of the hmtl (ie for offline use). * I want a mechanism (button or link) in the html, which allows the user to open/save the data the csv. ## Search for a solution There are techniques for embedding rdata files. * http://rmarkdown.rstudio.com/articles_rdata.html * https://github.com/richarddmorey/BayesFactorExtras/blob/master/BayesFactorExtras/R/downloadURI.R ## Question * Dispite of above approaches, I did not find a solution yet how to solve the problem. * How can it be achieved demonstrating it via this reproducable example ? 
+5
source share
3 answers

No javascript; no widgets; no extra CSS; 4 LoC (cld be 1 LoC if you like unreadable code):

 ```{r} write.csv2(mtcars, "./file.csv") library(magrittr) readLines("./file.csv") %>% paste0(collapse="\n") %>% openssl::base64_encode() -> encoded ``` [Download CSV](`r sprintf('data:text/csv;base64,%s', encoded)`) 

Simple enough:

  • treat the file as "material" and read it as lines
  • make all one blob text with newline separator
  • encode it to base 64
  • create data URI with the appropriate media type
  • embed it as a markdown link

You can also do something like:

 <a download="mtcars.csv" href="`r sprintf('data:text/csv;base64,%s', encoded)`">Straight HTML Download Link</a> 

if you want to provide the browser (and, therefore, users) with the proposed file name (HTML placement is applied in markdown rules).

Note:

 readBin("./file.csv", "raw", file.info("./file.csv")$size) %>% openssl::base64_encode() -> encoded 

also works the same as well as the readLines() version.

+11
source

How about something like this:

 --- title: "Reproducable Example" author: "dimitris_ps " date: "17 December 2016" output: html_document --- <style> #DataTables_Table_0 { visibility: hidden; } #DataTables_Table_0_paginate { visibility: hidden; } </style> ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) library(DT) dt <- datatable(mtcars, rownames=T, # filter = 'top', callback=JS('$("a.buttons-collection").css("background","#008CBA"); $("a.buttons-collection").css("font-size","15px"); $("a.buttons-collection").css("border-radius", "8px"); $("a.buttons-collection").css("margin-right","0px"); return table;'), extensions = 'Buttons', options = list(searching=F, paging = T, bInfo = F, columnDefs = list(list(className = 'dt-left', targets = 0), list(className = 'dt-center', targets = 1:11)), pageLength = 1, initComplete = JS("function(settings, json) {", "$(this.api().table().header()).css({'background-color': '#99ccff', 'color': '#003333'});", "}"), dom = 'Bfrtip', buttons = list( list(extend = 'collection', buttons = c('excel', 'csv'), text = 'DOWNLOAD DATA') ) ) ) ``` <br> ```{r mtcars, echo=FALSE} dt ``` 

You will need the DT library installed

+2
source

Based on the response from user hrbrmstr, I prepared a convenient function embed_data() , see the action:

 --- title: "Untitled" author: "user2030503" date: "17 12 2016" output: html_document --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) ``` ```{r echo=FALSE} embed_data= function(x= mtcars, filename= "file.csv", label= "Get data"){ # Create encoded Base64 datastream encode_data= function(x){ write.csv2(x, "./file.csv") enc= sprintf('data:text/csv;base64,%s', openssl::base64_encode(paste0(readLines("./file.csv"), collapse="\n")) ) unlink("./file.csv") return(enc) } # String result ready to be placed in rmarkdown paste0("<a download='", filename, "' href=", encode_data(x), ">", label, "</a>") } ``` `r embed_data(mtcars, filename="mtcars.csv")` 
+1
source

Source: https://habr.com/ru/post/1261425/


All Articles