在閃亮的應用程序中點擊下載按鈕後,會打開一個新頁面來初始化下載。但是,我的下載處理程序需要一些時間才能生成可下載的文件,該文件顯示在主閃亮頁面上的進度條中。有沒有辦法將用戶保留在主頁面上,或阻止下載頁面打開或推遲下載頁面直到文件生成?有沒有辦法阻止下載頁面在R Shiny中打開?
非常感謝
馬庫斯
在閃亮的應用程序中點擊下載按鈕後,會打開一個新頁面來初始化下載。但是,我的下載處理程序需要一些時間才能生成可下載的文件,該文件顯示在主閃亮頁面上的進度條中。有沒有辦法將用戶保留在主頁面上,或阻止下載頁面打開或推遲下載頁面直到文件生成?有沒有辦法阻止下載頁面在R Shiny中打開?
非常感謝
馬庫斯
使用兩個按鈕,用於計算和下載下載按鈕的操作按鈕,文森特的解決方案是我去的時候。這個解決方案的額外好處是進度條也在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
在旁註:您現在可以通過在服務器和UI的代碼之外定義一個'reactiveValues()'對象來使用全局變量。這比使用'<< - '清晰得多,並且可以防止您意外覆蓋全局環境中的重要對象。 –
這裏爲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")
不知道有一個簡單/清潔溶液(見朱利安的反應)。作爲一種解決方法,您可以添加一個動作按鈕(例如,「創建下載」)來生成您想要的文件。當文件可用時顯示下載按鈕。 – Vincent