library(shiny)
## Warning: package 'shiny' was built under R version 4.3.3
library(car)
## Warning: package 'car' was built under R version 4.3.3
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.3.3
library(readxl)

# Define UI for the application
ui <- fluidPage(
  titlePanel("Statistical Analysis and Modeling - Project 2"),
  sidebarLayout(
    sidebarPanel(
      fileInput("datafile", "Upload Data File", accept = c(".csv", ".xlsx")),
      uiOutput("response_var"),
      uiOutput("predictor_vars"),
      actionButton("analyze", "Run Analysis")
    ),
    mainPanel(
      tabsetPanel(
        tabPanel("Model Summary", verbatimTextOutput("modelSummary")),
        tabPanel("VIF Check", verbatimTextOutput("vifOutput")),
        tabPanel("Diagnostic Plots", plotOutput("diagPlot"))
      )
    )
  )
)

# Define server logic
server <- function(input, output, session) {
  
  # Reactive data reading
  data <- reactive({
    req(input$datafile)
    ext <- tools::file_ext(input$datafile$name)
    if (ext == "xlsx") {
      read_excel(input$datafile$datapath)
    } else {
      read.csv(input$datafile$datapath)
    }
  })

  # Dynamic UI for variable selection
  output$response_var <- renderUI({
    req(data())  # Ensure data is available
    var_names <- names(data())
    selectInput("response", "Select Response Variable:", choices = var_names)
  })

  output$predictor_vars <- renderUI({
    req(data())  # Ensure data is available
    var_names <- names(data())
    selectInput("predictors", "Select Predictor Variables:", choices = var_names, multiple = TRUE)
  })

  # Analysis logic
  observeEvent(input$analyze, {
    req(input$response)
    req(input$predictors)
    
    df <- data()
    predictors <- input$predictors
    response <- input$response

    # Validate the selected response and predictors
    if (response %in% names(df) && all(predictors %in% names(df))) {
      
      # Create the formula for the linear model
      formula <- as.formula(paste(response, "~", paste(predictors, collapse = "+")))
      
      # Fit the model
      model <- lm(formula, data = df)

      # Render the model summary
      output$modelSummary <- renderPrint({ summary(model) })

      # Render the VIF output
      output$vifOutput <- renderPrint({ vif(model) })

      # Render diagnostic plots
      output$diagPlot <- renderPlot({
        par(mfrow = c(2, 2))
        plot(model)
      })
      
    } else {
      # Error message if the response or predictors are invalid
      output$modelSummary <- renderPrint({ "Invalid response or predictor variables selected." })
    }
  })
}

# Run the application
shinyApp(ui = ui, server = server)
Shiny applications not supported in static R Markdown documents