NIrbhay Mathur
NIrbhay Mathur

Reputation: 196

After browse data it not displayed in shiny dashboard

I want to upload a file using "Browse option" after that, I want to do autofill of table using "WorklistNo"(means: choosing one input should fill rest field automatically) values and rest column should be auto fill. But I am getting some errors. Based on WorklistNo my other data should be populated in different input boxes in the shiny dashboard.

[![enter image description here][1]][1]library(shiny)
library(shinydashboard)

ui <- dashboardPage(
  dashboardHeader(title = "Basic dashboard"),
  dashboardSidebar(),
  dashboardBody(
    fluidRow(
      fileInput("file_upload","Uplaod Data",buttonLabel = "Browse..",placeholder = "No file Selected")
    ),
    fluidRow(
      column(3,
             uiOutput("p1_ui")
      ),
      column(3,
             uiOutput("p2_ui")
      ),
      column(3,
             uiOutput("p3_ui")
      )
    ),
    fluidRow(
      column(6,
             h3("Uploaded DATA"),
             DTOutput("uploaded_data_table")
      ),
      column(6,
             h3("Selected DATA"),
             DTOutput("selected_data_table")
      )
    )
  )
)

server <- function(input, output,session) {
  values <- reactiveValues(
    upload_state = NULL
  )
  data_upload_fun<-eventReactive(input$file_upload,{
    req(input$file_upload)
    if(values$upload_state=='reset'||is.null(values$upload_state))
    {
      data_in<-read_xlsx(input$file_upload$datapath
                    )
      values$upload_state <- 'uploaded'
      data_in
    }  
  })
  output$uploaded_data_table <- renderDT({
    DT::datatable(data_upload_fun())
  })
  output$p1_ui<-renderUI({
    if(is.null(values$upload_state)|| values$upload_state=='reset')
    {
      selectInput("p1", choices = NULL, label = 'WorklistNo')
   } 
    else
    {
      data_upload_fun()
      selectInput("p1", choices = uploade_data$WorklistNo, label = 'WorklistNo')
    }
  })

  output$p2_ui<-renderUI({
    if(is.null(values$upload_state)|| values$upload_state=='reset')
    {
      selectInput("p2", choices = NULL, label = 'Status')
    }
    else
    {
      data_upload_fun()
      status<-data_in[data_in$WorklistNo==input$p1,2]
      selectInput("p2", choices = as.list(status), label = 'Status')
    }
  })
  output$p3_ui<-renderUI({
    if(is.null(values$upload_state)|| values$upload_state=='reset')
    {
      selectInput("p3", choices = NULL, label = 'Plant')
    }
    else
    {
      data_upload_fun()
      plant<-data_in[data_in$WorklistNo==input$p1 & data_in$Status==input$p2,3]
      selectInput("p3", choices = as.list(plant), label = 'Plant')
    }
  })

  output$selected_data_table<-renderDT({
    if(is.null(values$upload_state)|| values$upload_state=='reset')
    {
      returnValue()
    }
    else
    {
      data_upload_fun()
      data_to_show<-data_in[data_in$WorklistNo==input$p1 & data_in$Status==input$p2 & data_in$Plant== input$p3, ]
      DT::datatable(data_to_show)
    }
  })

}

shinyApp(ui, server) 

enter image description here

Upvotes: 0

Views: 156

Answers (2)

Subhasish1315
Subhasish1315

Reputation: 978

from the previous question it seems you want to do this reactively. You need to understand the concept of Shiny Reactive component Behavior.

However, Few points need to highlight.

  • Make 'data_in<-read_xlsx()' as 'data_in<<-read_xlsx()' to make it global assignment.
  • In output$pi_ui you have used 'uploade_data$WorklistNo' which will be 'data_in$WorklistNo'
  • I think you are uploading a static excel file. So you need to modify the code according your excel. My code was running on based on my excel. So to make it working you need to change accordingly.

    However you need to give a minimal reproducible code even you want to work with your data then kindly provide minimal data set.

Revised Code with same dataset(.xlsx file)

library(shinydashboard)
library(DT)
library(xlsx)

ui <- dashboardPage(
  dashboardHeader(title = "Basic dashboard"),
  dashboardSidebar(),
  dashboardBody(
    fluidRow(
      fileInput("file_upload","Uplaod Data",buttonLabel = "Browse..",placeholder = "No file Selected")
    ),
    fluidRow(
      column(3,
             uiOutput("p1_ui")
      ),
      column(3,
             uiOutput("p2_ui")
      ),
      column(3,
             uiOutput("p3_ui")
      )
    ),
    fluidRow(
      column(6,
             h3("Uploaded DATA"),
             DTOutput("uploaded_data_table")
      ),
      column(6,
             h3("Selected DATA"),
             DTOutput("selected_data_table")
      )
    )
  )
)

server <- function(input, output,session) {
  values <- reactiveValues(
    upload_state = NULL
  )
  data_upload_fun<-eventReactive(input$file_upload,{
    req(input$file_upload)
    if(values$upload_state=='reset'||is.null(values$upload_state))
    {
      data_in<<-read.xlsx(input$file_upload$datapath,1)
      values$upload_state <- 'uploaded'
      data_in
    }  
  })


  output$uploaded_data_table <- renderDT({
    DT::datatable(data_upload_fun())
  })
  output$p1_ui<-renderUI({
    if(is.null(values$upload_state)|| values$upload_state=='reset')
    {
      selectInput("p1", choices = NULL, label = 'WorklistNo')
    } 
    else
    {
      data_upload_fun()
      selectInput("p1", choices = data_in$WLID, label = 'WorklistNo')
    }
  })

  output$p2_ui<-renderUI({
    if(is.null(values$upload_state)|| values$upload_state=='reset')
    {
      selectInput("p2", choices = NULL, label = 'Status')
    }
    else
    {
      data_upload_fun()
      status<-data_in[data_in$WLID==input$p1,3]
      selectInput("p2", choices = as.list(status), label = 'Status')
    }
  })
  output$p3_ui<-renderUI({
    if(is.null(values$upload_state)|| values$upload_state=='reset')
    {
      selectInput("p3", choices = NULL, label = 'Plant')
    }
    else
    {
      data_upload_fun()
      plant<-data_in[data_in$WLID==input$p1 & data_in$STATUS==input$p2,2]
      selectInput("p3", choices = as.list(plant), label = 'Plant')
    }
  })

  output$selected_data_table<-renderDT({
    if(is.null(values$upload_state)|| values$upload_state=='reset')
    {
      returnValue()
    }
    else
    {
      data_upload_fun()
      data_to_show<-data_in[data_in$WLID==input$p1 & data_in$STATUS==input$p2 & data_in$PLANT== input$p3, ]
      DT::datatable(data_to_show)
    }
  })

}

shinyApp(ui, server) 

enter image description hereenter image description here

Hope this helps...

Upvotes: 1

Jaccar
Jaccar

Reputation: 1854

When you call a reactive, you can't reference something that's been created within it - you reference the reactive. So where you reference data_in, you should be using data_upload_fun().

The other issue is that uploade_data doesn't seem to be a dataset in your code so you have possibly made a typo there or have accidentally not included a dataset.

I can't run your code so I'm not totally sure if that will fix everything but it deals with some of the issues.

Upvotes: 0

Related Questions