2014-01-29 70 views
4

在閃亮的應用程序中點擊下載按鈕後,會打開一個新頁面來初始化下載。但是,我的下載處理程序需要一些時間才能生成可下載的文件,該文件顯示在主閃亮頁面上的進度條中。有沒有辦法將用戶保留在主頁面上,或阻止下載頁面打開或推遲下載頁面直到文件生成?有沒有辦法阻止下載頁面在R Shiny中打開?

非常感謝

馬庫斯

+1

不知道有一個簡單/清潔溶液(見朱利安的反應)。作爲一種解決方法,您可以添加一個動作按鈕(例如,「創建下載」)來生成您想要的文件。當文件可用時顯示下載按鈕。 – Vincent

回答

6

使用兩個按鈕,用於計算和下載下載按鈕的操作按鈕,文森特的解決方案是我去的時候。這個解決方案的額外好處是進度條也在shinyIncubator包中。

我的代碼櫃面別人的解釋想做同樣的事情:

的ui.R有一個操作按鈕和一個動態的下載按鈕:

actionButton("makePlots", "Calculate Results"), 
uiOutput("download_button") 

,並在進度初始化進度條:

mainPanel(
    progressInit(), 
     uiOutput("mytabs")) # dynamic rendering of the tabs 

server.R稍微複雜一點。所以,當有東西下載我用動態uiOutput用下面的代碼只顯示下載按鈕:

output$download_button <- renderUI({ 
      if(download){ 
       downloadButton("downloadPlots", "Download Results") 
      } 
    }) 

下載按鈕時,纔會顯示download==TRUE時。在server.R開始時,變量被初始化:download<-FALSE

隨着動作按鈕每次點擊時增加1,我在每次使用動作按鈕後都會增加一個計數器(初始值爲0)。原因是這是第一個if語句。

makePlots<-reactive({ 

    if(input$makePlots>counter){ # tests whether action button has been clicked 

     dir.create("new_directory_for_output") 

     withProgress(session, min=1, max=15, expr={ # setup progress bar 

     for(i in 1:15){ 

     png(paste0("new_directory_for_output/plot",i,".png")) 
     plot(i) 
     dev.off() 

     setProgress(message = 'Calculation in progress', 
       detail = 'This may take a while...', 
       value=i) 

     } # end for 

     }) # end progress bar 

     counter<<-counter+1 # needs the <<- otherwise the value of counter 
          # is only changed within the function 

     download<<-TRUE  # something to download  

    } # end if 

}) # end function 

在這個階段,函數makePlots()沒有輸出,也沒有被調用,因此它什麼都不做。因此,我在每個選項卡的開頭放置了makePlots(),以便無論用戶使用哪個選項卡,一旦點擊了操作按鈕,就會製作並保存圖。

最後一塊拼圖德的是下載處理程序:

output$downloadPlots <- downloadHandler(

    filename = function() { my_filename.zip }, 
    content = function(file){ 

     fname <- paste(file,"zip",sep=".") 
     zip(fname,new_directory_for_output) # zip all files in the directory 
     file.rename(fname,file) 

     unlink(new_directory_for_output,recursive = TRUE) # delete temp directory 
     download<<-FALSE # hide download button 
    } 

    ) # end download handler 
+1

在旁註:您現在可以通過在服務器和UI的代碼之外定義一個'reactiveValues()'對象來使用全局變量。這比使用'<< - '清晰得多,並且可以防止您意外覆蓋全局環境中的重要對象。 –

4

這裏爲downloadHandler輸出生成的HTML代碼的示例:

<a id="downloadData" class="btn shiny-download-link shiny-bound-output" target="_blank" href="session/d832cc1f9218bd9e356572b089628030/download/downloadData?w=">Download</a> 

目標屬性指定在何處打開在href,target="_blank"打開它在新選項卡或新窗口。

默認情況下(在許多瀏覽器上)當你打開一個新標籤頁時,它會關注它,這是你想要避免的,問題在於你不能用一些HTML/JS來改變客戶端的默認行爲。

此外,更改爲target="self"將在與點擊相同的框架中打開href網址,但問題是它將關閉當前會話,並且您需要打開此會話(帶有localhost:port url的選項卡)才能下載DATAS。

雖然,您可以添加一個令人不安的注意,即用戶可以使用Ctrl +單擊打開下載,而不必關注新的空白選項卡。

例如:

helpText("Note : Use Ctrl+Click to open the download in background") 
相關問題