闪亮的交互式文档下载按钮覆盖原始的R markdown

时间:2016-12-05 22:03:16

标签: r shiny rstudio r-markdown

所以我正在尝试编写一个带有交互式闪亮位的html R markdown文档,允许用户编辑图形然后将结果下载到pdf。但是,我尝试这样做的方式有一些灾难性的错误,因为一旦html启动,它就会用pdf的内容覆盖原始的markdown文件 - 在编辑器中将其变成完全的乱码。

我怀疑我在R找到了一种全新的失败方法,但我无法找到其他人遇到此问题的地方。另外,我查看了闪亮的参考资料,此时我只是在圈子里,所以任何帮助都会非常感激。

我正在使用Rstudio 1.0.44,rmarkdown 1.2和闪亮的0.14.2。一个小的(不是)工作示例:

---
title: "Minimum Failing Example"
author: "wittyalias"
date: "December 5, 2016"
output: html_document
runtime: shiny
---

```{r echo = FALSE}
library(ggplot2)

today <- Sys.Date()

inputPanel(downloadButton("dnld", label = "Download pdf"))

renderPlot({
    # Example code from http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/
    p1 <<- ggplot(ChickWeight, aes(x=Time, y=weight, colour=Diet, group=Chick)) +
    geom_line() +
    ggtitle("Growth curve for individual chicks")
    p1
})

reactive({
    fname <- paste0("Chick Weight - ", today, ".pdf")

    output$dnld <- downloadHandler(filename = fname,
                    content = makethepdf(file))

    makethepdf <- function(fname) {
        pdf(fname,
            width = 14,
            height = 8.5)
        p1
        dev.off()
}
})
```

编辑:要明确:我希望用户能够下载多页图形,其中一些将具有不同的格式。用户不会只下载降价文档的pdf版本。

3 个答案:

答案 0 :(得分:0)

这是因为我无法识别makethepdf的原因与file = [name of the file]一起运行。插入print(fname)即可查看。下载处理程序不应该在观察者内部。你需要自己在户外。由于某种原因,我也未能将pdf() dev.off()组合工作,所以这是下面的工作版本。

output$dnld = downloadHandler(filename =  paste0("Chick Weight - ", today, ".pdf"),
                          content = function(file){
                              ggsave(file, plot = p1, width = 14, height = 8.5)
                          })

答案 1 :(得分:0)

使用tempfile()tempdir()创建临时文件:

 output$downloadReport = downloadHandler(

    filename = function() {
      normalizePath(tempfile("report_", fileext = ".docx"), winslash = "/")
    },

    content = function(file) {

    out = rmarkdown::render("./report.Rmd", 
                            output_file = file,
                            output_dir = tempdir(),
                            output_format = "pdf_document",
                            intermediates_dir = tempdir(),
                            envir = new.env(),
                            params = list( fontSize = 10)
  )
})

我通常为下载的报告使用单独的.Rmd模板,因为布局和文本通常类似,但与应用程序中的工作方式不同。

我还发现使用参数是将输入设置从我的应用程序传递到报表的便捷方式。有关详细信息,请参阅this RStudio post

答案 2 :(得分:0)

好吧,我的代码存在很多问题,但是使用其他答案中的一些建议我已经能够解决了。

这个小文档的主要问题是downloadHandler 中的content是一个函数,但在我的代码中,我设置content等于的结果函数调用。看起来当首次运行闪亮的应用程序时,它会编译content,认为它是一个函数,但实际上最终会调用该函数。它发送file作为争论,除了作为基函数之外似乎不存在。当我在控制台中使用makethepdf时,只调用file会引发错误,但无论出于何种原因,这个应用程序只是跟着调用,显然是file = [name of the .Rmd](正如OganM所说的那样) )。

要修复,请更改此内容:

output$dnld <- downloadHandler(filename = fname,
                content = makethepdf(file))

output$dnld <- downloadHandler(filename = fname,
                content = makethepdf)

要明确:如果content使用makethepdf以外的任何参数调用file,则此代码不会覆盖.Rmd文件。例如,content = makethepdf(fnm))会导致下载按钮显示object not found错误,而content = makethepdf(fname))会导致下载按钮在按下时抛出attempt to apply non-function错误。