Shiny: Show buttons only after file has been uploaded

前端 未结 2 718
清歌不尽
清歌不尽 2021-02-05 17:24

I\'m experimenting with Shiny and I love it. I built a little application where students upload a csv file and then choose a dependent variables and independent variables and th

2条回答
  •  一生所求
    2021-02-05 17:55

    Here's the working ShinyApp and the final version of both ui.R and server.R based on all the suggestions provided by Marat.

    First the ui.R

    # ui.R
    
    library(shiny)
    
    shinyUI(fluidPage(
      titlePanel("Multiple Linear Regression with R/Shiny"),
      sidebarLayout(
        sidebarPanel(
          p("Please upload a CSV formatted file with your data."),
          fileInput('file1', label='Click button below to select the file in your computer.',
                    accept=c('text/csv', 
                             'text/comma-separated-values,text/plain', 
                             '.csv')),
    
          tags$hr(),
          uiOutput("dependent"),
          uiOutput("independents"),
          tags$hr(),
          uiOutput('ui.action') # instead of conditionalPanel
        ),
        mainPanel(
          p("Here's the output from your regression:"),
          verbatimTextOutput('contents')
        )
      )
    ))
    

    and server.R

    # server.R
    
    library(shiny)
    
    shinyServer(function(input, output) {
    
      filedata <- reactive({
        infile <- input$file1
        if (is.null(infile)){
          return(NULL)      
        }
        read.csv(infile$datapath)
      })
    
      output$ui.action <- renderUI({
        if (is.null(filedata())) return()
        actionButton("action", "Run regression")
      })
    
      output$dependent <- renderUI({
        df <- filedata()
        if (is.null(df)) return(NULL)
        items=names(df)
        names(items)=items
        selectInput("dependent","Now select ONE variable as dependent variable from:",items)
      })
    
    
      output$independents <- renderUI({
        df <- filedata()
        if (is.null(df)) return(NULL)
        items=names(df)
        names(items)=items
        selectInput("independents","Also select ONE or MANY independent variables in the box below. You can change your selection several times:",items,multiple=TRUE)
      })
    
    
      output$contents <- renderPrint({
        if (is.null(input$action)) return()
        if (input$action==0) return()
        isolate({
          df <- filedata()
          if (is.null(df)) return(NULL)
          fmla <- as.formula(paste(input$dependent," ~ ",paste(input$independents,collapse="+")))
          summary(lm(fmla,data=df))
        })
      })
    
    
    }) 
    

    Once again thanks for your help Marat.

提交回复
热议问题