2016-12-17 23 views
5
  • Przykład
  • Problem oświadczenie
  • poszukiwanie rozwiązań i
  • Pytanie

... zobacz rmarkdown przykładowy kod.HTML CSV w html rmarkdown

Doceń odpowiedzi pokazujące rozwiązanie, modyfikując fragment kodu rarkdown.

--- 
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 (i.e. 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 ? 

Odpowiedz

11

No javascript; brak widżetów; bez dodatkowego CSS; 4 LoC (CLD być 1 LoC jeśli chcesz kod nieczytelny):

```{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)`) 

dość proste:

  • traktować jak plik tylko "rzeczy" i przeczytać go w postaci linii
  • sprawiają, że wszystkie jedna plama z nową linią tekstu rozdzielonego
  • zakodować je podstawy 64
  • dokonać URI danych z odpowiedniego typu nośnika
  • osadzić jako am arkdown Link

Można też zrobić coś takiego:

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

jeśli chcesz dać przeglądarek (i stąd użytkowników) sugerowaną nazwę pliku (umieszczenie HTML w zasadach przecen zastosowanie).

UWAGA:

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

również działa równie dobrze jak wersja readLines().

+0

Niestety to rozwiązanie nie działa w IE 11 (Windows 8). Link wygenerowany przez rozwiązanie nie wywołuje niczego. Jak można to naprawić? – user2030503

+2

Tak, użyj prawdziwej przeglądarki ;-) Wygląda na to, że jest to znany problem z IE 11 będącym martwym mózgiem: http://caniuse.com/#feat=datauri; to oznacza, że ​​nie można osadzić tego typu identyfikatora URI danych dla IE 11. Wygląda na to, że Edge także nie żyje. – hrbrmstr

+0

To rozwiązanie jest dobre dla Chrome, ale w Safari pobieranie nie jest inicjowane i widzimy tylko csv wyświetlany w przeglądarce. Czy jest w pobliżu praca? –

2

Jak o coś takiego:

--- 
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 
``` 

Musisz mieć zainstalowane biblioteki DT

+0

Doceń swój wysiłek. Dwa problemy: 1. jest mały: dwie funkcje JS wymagają prefiksu DT ::. 2. jest większy: nie chcę wyświetlać tabeli. Czy możesz refaktoryzować, aby pozostały tylko przyciski? – user2030503

+0

Na twoim punkcie 1 wczytaj 'bibliotekę (DT)', to jest to, co miałem na początku. Dziękuję za wskazanie. W twoim punkcie 2 może istnieć obejście z ukrytą tabelą "css". Wrócę do tego później –

+0

Mam zaktualizowaną odpowiedź. Nie jest to najlepsze podejście, ale jest zbliżone do tego, czego szukasz. Zasadniczo ukrywam 'DataTable' z' css' –

1

podstawie answer z użytkownikiem hrbrmstr I przygotował funkcję ogólnospożywczy embed_data(), zobaczyć go w akcji:

--- 
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")`