2016-12-05 100 views
0

所以我試圖用交互式閃亮位寫一個html R markdown文檔,允許用戶編輯圖形,然後將結果下載到pdf。但是,我嘗試這樣做的方式存在一些災難性的錯誤,因爲一旦html開始,它就會用pdf的內容覆蓋原始的降價文件 - 在編輯器中將其變爲完整的亂碼。閃亮的交互式文檔下載按鈕覆蓋原來的R 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版本。

回答

0

好吧,所以我的代碼存在一些問題,但在其他答案中使用了一些建議,我已經能夠解決它。

與這個小文件的主要問題是,content在downloadHandler 是一個功能,但在我的代碼設置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) 

要明確:該代碼不會覆蓋。Rmd文件,如果content調用makethepdf以及除file以外的任何參數。例如,content = makethepdf(fnm))會導致下載按鈕顯示object not found錯誤,content = makethepdf(fname))會導致下載按鈕在按下時出現attempt to apply non-function錯誤。

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) 
          }) 
+0

非常感謝您的建議,但我需要在pdf中創建多個頁面,據我所知,ggsave不會允許我這樣做。另外,我在makethepdf函數的外部和內部插入了'print(fname)',並且返回了我期望的「Chick Weight .... pdf」。 – wittyalias

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

+0

這是一個好主意,我不知道可以做到。我會考慮明天使用它,但我不確定它會起作用。我只想包含圖表,而不是完整的降價報表。那可能嗎? – wittyalias