2014-01-29 46 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") 
相关问题