- 示例
- 问题语句
- 解决方案搜索和
- 问题
...请参阅rmarkDown示例代码。
感谢通过修改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 ?
no javaScript;没有小部件;没有额外的CSS;4 LOC(如果您喜欢不可读的代码,则为1个LOC):
```{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)`)
相当简单:
- 将文件视为"东西",然后将其读为行
- 使其全部newline分开的文本
- 将其编码为64
- 用适当的媒体类型制作数据URI
- 将其嵌入为Markdown链接
您也可以做类似:
的事情<a download="mtcars.csv" href="`r sprintf('data:text/csv;base64,%s', encoded)`">Straight HTML Download Link</a>
如果您想为浏览器(以及用户)提供建议的文件名(应用Markdown规则中的HTML放置)。
注意:
readBin("./file.csv", "raw", file.info("./file.csv")$size) %>%
openssl::base64_encode() -> encoded
也与readLines()
版本一样工作。
这样的事情怎么样:
---
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
```
您需要安装DT
库
基于用户HRBRMSTR的答案,我准备了便利函数embed_data()
,请参阅行动:
---
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")`