0

I'm building a simple shiny app which will take inputs from the user and fetch data from a table in the DB and take the number of records to be downloaded as an input and provide a download file option.

Everything below works just fine. My only concern is the textInput bar( variable : uiOutput("text") in the ui and output$text in the server) appears only after the datatableOutput is displayed. I do not understand why this happens.

Ideally, I want the textInput bar ('uiOutput("text")') object to be displayed once the leaf(i.e. input$leaf1 is not null) is selected and then I want the datatableOutput to be displayed and then the Download Button should come up.

Is there a way I can achieve this? Thanks

library(shiny)
library(shinydashboard)
#library(stringr)
library(DT)
#library(shinyBS) 


ui <- dashboardPage(
  dashboardHeader(title = strong("DASHBOARD"),titleWidth = 240),
  dashboardSidebar(
    sidebarMenu(
     selectizeInput("x", "Choose a number:", choices = sort(unique(lftable$x)), multiple = TRUE),
     uiOutput("leaf_categ")

  )
  ),
  dashboardBody(
    fluidRow(
      uiOutput("text"),
      dataTableOutput("lm_df"),
      downloadButton('downloadData', 'Download')

 )))


server <- function(input, output){
  output$leaf_categ <- renderUI(
    selectizeInput("leaf1", "Choose leaf categories:",
                  choices = reactive(unique(lftable[lftable$num %in% input$x, c("X_NAME")]))(),
                  multiple = TRUE)

  ) 

  #### creates a text input box
  #### number of records to be downloaded is provided as input 
  output$text <- renderUI({
    if(is.null(reactive(input$leaf1)())){
      return()
    }else{
      textInput("var1", label = "Enter the number of records to be downloaded", value = "")
    }
  })

  #### fetches data from DB
  lm <- reactive({
    if(is.null(input$leaf1)){
      return()
    }else{
      leaf_id <- unique(lftable[lftable$X_NAME %in% input$leaf1, c("leaf_id")])
      query_str <- paste('select * from table1 where current_date between start_dt and end_dt and score_num >= 0.1 and x in (' , input$x, ')', ' and X_ID in (', leaf_id, ')', ';', sep = "")
    }
    lm_data <- getDataFrmDW(query_str)
  })

  ###creates a download tab
  output$downloadData <- downloadHandler(
    filename = function() { paste("lm_user_data", '.csv', sep='') },
    content = function(file) {
      lm_df <- lm()
      lm_df <- lm_df[1:(as.integer(input$text)),]
      print(dim(lm_df))
      write.csv(lm_df, file, row.names = F)
    })

  output$lm_df <- DT::renderDataTable(lm())


}
shinyApp(ui, server)
user1946217
  • 1,733
  • 6
  • 31
  • 40

0 Answers0