我有一个闪亮的应用程序,在服务器上执行相对冗长的分析。我想有几个选项卡允许用户查看和下载分析的输出。只有在分析完成后才能看到这些选项卡。
example here隐藏了一个标签,直到一个事件(在这种情况下点击按钮),但我还没有能够弄清楚事件是否完成了分析。
在下面的最小示例中,我已经调整了示例 - 按下按钮后标签仍然可见。
如何使它成为tab2"只有在循环完成后才会显示?
library(shiny)
library(shinyjs)
ui <- tagList(
useShinyjs(),
navbarPage(
"move/view tabs after analysis",
id = "navbar",
tabPanel(
title = "Start",
actionButton("button", "Run Analysis")
),
tabPanel(
title = "Analysis output",
value = "tab2",
tableOutput("tableOutput")
)
)
)
server <- function(input, output, session) {
observe({
hide(selector = "#navbar li a[data-value=tab2]")
})
observeEvent(input$button, {
output$tableOutput <- renderTable({
withProgress(message = 'Working', {
for(i in 1:5) {
incProgress(1/5)
Sys.sleep(2)
}
})
})
})
observeEvent(input$button, {
toggle(selector = "#navbar li a[data-value=tab2]")
})
}
shinyApp(ui = ui, server = server)
答案 0 :(得分:1)
以下是诀窍。这首先在外部正确定义表输出,而不是在observe语句中定义,但是在单击按钮之前返回NULL。如果单击该按钮,它将执行长时间运行的计算,之后才会取消隐藏选项卡。
library(shiny)
library(shinyjs)
ui <- tagList(
useShinyjs(),
navbarPage(
"move/view tabs after analysis",
id = "navbar",
tabPanel(
title = "Start",
actionButton("button", "Run Analysis")
),
tabPanel(
title = "Analysis output",
value = "tab2",
tableOutput("tableOutput")
)
)
)
server <- function(input, output, session) {
observe({
hide(selector = "#navbar li a[data-value=tab2]")
})
output$tableOutput <- renderTable({
if(input$button > 0){
withProgress(message = 'Working', {
for(i in 1:5) {
incProgress(1/5)
Sys.sleep(2)
}
})
toggle(selector = "#navbar li a[data-value=tab2]")
}else{
NULL
}
})
outputOptions(output,"tableOutput", suspendWhenHidden=F)
}
shinyApp(ui = ui, server = server)