2016-12-17 18 views
5
  • Ví dụ
  • Vấn đề tuyên bố
  • Giải pháp tìm kiếm và
  • Câu hỏi

... xem mã ví dụ rmarkdown.Nhúng csv trong html rmarkdown

Đánh giá cao câu trả lời thể hiện giải pháp bằng cách sửa đổi đoạn mã rmarkdown.

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

Trả lời

11

Không javascript; không có vật dụng; không có CSS ​​phụ; 4 Lộc (cld được 1 Lộc nếu bạn thích mã không đọc được):

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

Khá đơn giản:

  • đối xử với các tập tin như chỉ là "công cụ" và đọc nó trong như dòng
  • làm cho nó tất cả một blob của newline tách văn bản
  • mã hóa nó thành cơ sở 64
  • tạo ra một dữ liệu URI với các loại phương tiện truyền thông thích hợp
  • nhúng nó như am liên kết arkdown

Bạn cũng có thể làm điều gì đó như:

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

nếu bạn muốn cung cấp cho các trình duyệt (và, do đó, người sử dụng) một tên tập tin đề nghị (vị trí HTML trong các quy tắc markdown phí).

LƯU Ý:

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

cũng làm việc bình đẳng cũng như các phiên bản readLines().

+0

Thật không may giải pháp này không hoạt động trong IE 11 (Windows 8). Liên kết được tạo ra bởi giải pháp không kích hoạt bất cứ điều gì. Làm thế nào nó có thể được cố định ? – user2030503

+2

Aye, sử dụng một trình duyệt thực sự ;-) Có vẻ như đây là một vấn đề đã biết với IE 11 là não chết: http://caniuse.com/#feat=datauri; điều đó có nghĩa là bạn không thể nhúng loại URI dữ liệu này cho IE 11. Có vẻ như Edge cũng đã chết não. – hrbrmstr

+0

Giải pháp này rất tuyệt vời cho Chrome nhưng trong Safari, việc tải xuống không được bắt đầu và chúng tôi chỉ thấy csv được hiển thị trên trình duyệt. Có cách giải quyết nào không? –

2

Làm thế nào về một cái gì đó như thế này:

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

Bạn sẽ cần phải có thư viện DT cài đặt

+0

Đánh giá cao nỗ lực của bạn. Hai vấn đề: 1. là một vấn đề nhỏ: Hai hàm JS yêu cầu tiền tố DT ::. 2. là một lớn hơn: Tôi không muốn hiển thị một bảng. Bạn có thể cấu trúc lại để chỉ còn lại các nút không? – user2030503

+0

Trên điểm bạn 1, tải 'thư viện (DT)', đây là những gì tôi đã có lúc đầu. Cảm ơn đã chỉ ra điều đó. Trên point2 của bạn có thể có một workaround với bảng 'css' ẩn. Tôi sẽ quay lại sau này –

+0

Tôi đã cập nhật câu trả lời của mình. Không phải là cách tiếp cận tốt nhất, nhưng gần với những gì bạn đang tìm kiếm. Về cơ bản, tôi đang ẩn 'DataTable' với' css' –

1

Dựa trên answer về thành viên hrbrmstr tôi đã chuẩn bị một chức năng tiện embed_data(), nhìn thấy nó trong hành động:

--- 
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")` 
Các vấn đề liên quan