Events and Dynamic UI

This week I focused on improving the usability of the Shiny app. I used Shiny’s renderUI function to dynamically generate the options for the game select dropdown. I also set up a baseball API here, and added another API endpoint to get the list of games that happened on any given day.

One of the nicer things I added to the Shiny app was the use of the tryCatch function to hide confusing error messages from the user, like this:

tryCatch({
     splitGames <- unlist(strsplit(input$game, " @ "))
     away <- teams[which(grepl(splitGames[1], names(teams)))]
     home <- teams[which(grepl(splitGames[2], names(teams)))]

     data <- getEvents(year, month, day, away, home)
     sliderInput("event", "Event:",
                 min = 1, max = length(data$probabilities),
                 value = length(data$probabilities), sep = 1)
   }, error = function(e) {
     stop("That is not a valid event")
   })

In reality, much of my week was spent fighting with R’s several methods of dealing with strings and arrays. Most of the changes this week were in the front end user-facing part of the app, so I’m excited to work more on the backend next week (maybe finally improving the win probability calculation?). As a side note, the app does generally work for spring training games (as long as Gameday is working at the moment).