+[{"name":"app.R","content":"#\r\n# This is a Shiny web application. You can run the application by clicking\r\n# the 'Run App' button above.\r\n#\r\n# Find out more about building applications with Shiny here:\r\n#\r\n# https://shiny.posit.co/\r\n#\r\n\r\nlibrary(shiny)\r\nlibrary(shinyWidgets)\r\nlibrary(shinylive)\r\nlibrary(httpuv)\r\n\r\n# Define UI for application that calculates time\r\nui <- fluidPage(\r\n\r\n # Application title\r\n titlePanel(\"Task Timing Calculator\"),\r\n\r\n br(),\r\n\r\n mainPanel(\r\n \r\n fluidRow(\r\n column(4, numericInput(\"time1_h\", \"Task Start Time (HH)\", 0, min = 0)),\r\n column(4, numericInput(\"time1_m\", \"Task Start Time (MM)\", 0, min = 0, max = 59)),\r\n column(4, numericInput(\"time1_s\", \"Task Start Time (SS)\", 0, min = 0, max = 59))\r\n ),\r\n br(),\r\n \r\n fluidRow(\r\n column(4, numericInput(\"time2_h\", \"Task End Time (HH)\", 0, min = 0)),\r\n column(4, numericInput(\"time2_m\", \"Task End Time (MM)\", 0, min = 0, max = 59)),\r\n column(4, numericInput(\"time2_s\", \"Task End Time (SS)\", 0, min = 0, max = 59))\r\n\r\n \r\n )),\r\n br(),\r\n \r\n sidebarPanel(\r\n checkboxInput(\"interruption\", \"Was there an interruption?\", value = FALSE),\r\n conditionalPanel(condition = \"input.interruption == true\",\r\n \r\n numericInput(\"num_int\", \"Number of Interruptions\", value = 0, min = 0, max = 10, step = 1),\r\n \r\n uiOutput(\"interruptions_ui\"),\r\n \r\n ),\r\n \r\n width= 8),\r\n \r\n br(),\r\n \r\n actionButton(\"reset\", \"Reset\"),\r\n \r\n hr(),\r\n \r\n h3(\"Total Coded Time\"),\r\n span(textOutput (\"coded_time\"), style= \"font-size:20px\")\r\n\r\n\r\n\r\n)\r\n \r\n\r\n# Server to calculate time\r\nserver <- function(input, output, session) {\r\n \r\n coded_time <- reactive({\r\n \r\n start_sec <- input$time1_h*3600 + input$time1_m*60 + input$time1_s\r\n \r\n end_sec <- input$time2_h*3600 + input$time2_m*60 + input$time2_s\r\n \r\n total_time <- end_sec - start_sec\r\n \r\n \r\n # Interruptions\r\n n <- input$num_int %||% 0\r\n \r\n if (n > 0) {\r\n \r\n interruption_seconds <- 0\r\n \r\n for (i in 1:n) {\r\n \r\n start_h <- input[[paste0(\"int\", i, \"_start_h\")]]\r\n start_m <- input[[paste0(\"int\", i, \"_start_m\")]]\r\n start_s <- input[[paste0(\"int\", i, \"_start_s\")]]\r\n \r\n end_h <- input[[paste0(\"int\", i, \"_end_h\")]]\r\n end_m <- input[[paste0(\"int\", i, \"_end_m\")]]\r\n end_s <- input[[paste0(\"int\", i, \"_end_s\")]]\r\n \r\n int_start <- start_h*3600 + start_m*60 + start_s\r\n int_end <- end_h*3600 + end_m*60 + end_s\r\n \r\n interruption_seconds <- interruption_seconds + (int_end - int_start)\r\n }\r\n \r\n total_time <- total_time - interruption_seconds\r\n }\r\n \r\n max(total_time, 0)\r\n \r\n })\r\n \r\n output$interruptions_ui <- renderUI({\r\n \r\n n <- min(input$num_int %||% 0, 10)\r\n \r\n if (is.null(n) || n == 0) return(NULL)\r\n \r\n lapply(1:n, function(i) {\r\n \r\n tagList(\r\n \r\n h4(paste(\"Interruption\", i)),\r\n \r\n fluidRow(\r\n column(4, numericInput(paste0(\"int\", i, \"_start_h\"),\r\n \"Start Time (HH)\", 0, min = 0)),\r\n column(4, numericInput(paste0(\"int\", i, \"_start_m\"),\r\n \"Start Time (MM)\", 0, min = 0, max = 59)),\r\n column(4, numericInput(paste0(\"int\", i, \"_start_s\"),\r\n \"Start Time (SS)\", 0, min = 0, max = 59))\r\n ),\r\n \r\n br(),\r\n \r\n fluidRow(\r\n column(4, numericInput(paste0(\"int\", i, \"_end_h\"),\r\n \"End Time (HH)\", 0, min = 0)),\r\n column(4, numericInput(paste0(\"int\", i, \"_end_m\"),\r\n \"End Time (MM)\", 0, min = 0, max = 59)),\r\n column(4, numericInput(paste0(\"int\", i, \"_end_s\"),\r\n \"End Time (SS)\", 0, min = 0, max = 59))\r\n ),\r\n \r\n br()\r\n )\r\n })\r\n \r\n })\r\n\r\noutput$coded_time <- renderText({\r\n \r\n seconds <- coded_time()\r\n \r\n h <- seconds %/% 3600\r\n m <- (seconds %% 3600) %/% 60\r\n s <- seconds %% 60\r\n \r\n sprintf(\"%02d:%02d:%02d\", h, m, s)\r\n\r\n})\r\n\r\nobserveEvent(input$reset, {\r\n \r\n updateNumericInput(session, \"time1_h\", value= 0)\r\n updateNumericInput(session, \"time1_m\", value= 0)\r\n updateNumericInput(session, \"time1_s\", value= 0)\r\n \r\n updateNumericInput(session, \"time2_h\", value= 0)\r\n updateNumericInput(session, \"time2_m\", value= 0)\r\n updateNumericInput(session, \"time2_s\", value= 0)\r\n \r\n updateCheckboxInput(session, \"interruption\", value = FALSE)\r\n updateNumericInput(session, \"num_int\", value= 0)\r\n})\r\n}\r\n\r\n\r\n# Run the application \r\nshinyApp(ui = ui, server = server)\r\n\r\n\r\n#shinylive::export(\"C:/Users/mametz/Documents/R Stuff/TimingCalculator\", \"docs\")\r\n#shinylive::export(\"C:/Users/mametz/Documents/R Stuff/TimingCalculator\", \"V:/mametz/GitHub/timing_calculator/docs\")\r\n#httpuv::runStaticServer(\"docs/\", port = 8008)\r\n","type":"text"},{"name":"README.md","content":"# timing_calculator","type":"text"}]
0 commit comments