在闪亮的应用程序中点击下载按钮后,会打开一个新页面来初始化下载。但是,我的下载处理程序需要一些时间才能生成可下载的文件,该文件显示在主闪亮页面上的进度条中。有没有办法将用户保留在主页面上,或阻止下载页面打开或推迟下载页面直到文件生成?有没有办法阻止下载页面在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