-2

I had a Shiny app where the original version did publish onto shinyapps.io. I then attempted a more complex version of the same app but it did not work, so I attempted returning to the original version, but now the simple version no longer works. The log reads:

Error in force(ui) : object 'ui' not found.

Then, traceback() gave me this:

16: execCallbacks(timeoutSecs, all, loop$id)
15: force(expr)
14: with_loop(loop, invisible(execCallbacks(timeoutSecs, all, loop$id)))
13: run_now(timeoutMs/1000, all = FALSE)
12: service(timeout)
11: serviceApp()
10: ..stacktracefloor..(serviceApp())
9: withCallingHandlers(expr, error = doCaptureStack)
8: domain$wrapSync(expr)
7: promises::with_promise_domain(createStackTracePromiseDomain(), 
       expr)
6: captureStackTraces({
       while (!.globals$stopped) {
           ..stacktracefloor..(serviceApp())
       }
   })
5: ..stacktraceoff..(captureStackTraces({
       while (!.globals$stopped) {
           ..stacktracefloor..(serviceApp())
       }
   }))
4: runApp(x)
3: do.call("runApp", args)
2: print.shiny.appobj(x)
1: (function (x, ...) 
   UseMethod("print"))(x)*

Here is the code:

ui.R

library(tidyverse)
library(cfbscrapR)
library(gt)
library(dplyr)
library(ggplot2)
library(DT)
library(shiny)
library(shinythemes)
library(rsconnect)
library(logger)
library(shinyjs)

###Now create the ui function

ui <- fluidPage(
  titlePanel(h1("College Football Analytics")),
  sidebarPanel(
    checkboxGroupInput("selections", label = h2(
      "Choose Weeks to Analyze"),
      choices = list("Week 1" = 1, "Week 2" = 2,
                     "Week 3" = 3, "Week 4" = 4,
                     "Week 5" = 5, "Week 6" = 6,
                     "Week 7" = 7, "Week 8" = 8,
                     "Week 9" = 9, "Week 10" = 10,
                     "Week 11" = 11, "Week 12" = 12,
                     "Week 13" = 13, "Week 14" = 14,
                     "Week 15" = 15),
      selected = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11",
                   "12", "13", "14", "15")),
    actionButton("submit", "Update")
  ),
  mainPanel(
    h2("2019 Season"),
    DT::dataTableOutput("table"),
    theme = shinytheme("cerulean")
  )
)

server.R

library(tidyverse)
library(cfbscrapR)
library(gt)
library(dplyr)
library(ggplot2)
library(DT)
library(shiny)
library(shinythemes)
library(rsconnect)
library(logger)
library(shinyjs)

pbp_2019 <- read.csv("pbp_2019.csv")
drives_2019 <- read.csv("drives_2019.csv")


#Define server logic
server <- function(input, output, session) {
  cfb.table2 <- reactive({
    input$submit
    isolate({
      req(input$selections)
      new.pbp_2019 <- subset(pbp_2019, week %in% input$selections)})
  })
  plays <- reactive({cfb.table2() %>% filter(rush == 1 | pass == 1)})
  offense <- reactive({plays() %>% group_by(offense_play) %>% summarise(ypa = mean(yards_gained[pass==1]), ypr = mean(yards_gained[rush==1]), num.plays = n()) %>% filter(num.plays > 300)})
  offense <- reactive({plays() %>% group_by(offense_play) %>% summarise(epa.pass.off = mean(EPA[pass==1]), success.rate = mean(success), epa.rush.off = mean(EPA[rush==1]), num.plays = n()) %>% filter(num.plays > 300)})
  defense <- reactive({plays() %>% group_by(defense_play) %>% summarise(epa.pass.def = mean(EPA[pass==1]), epa.rush.def = mean(EPA[rush==1]), num.plays = n()) %>% filter(num.plays > 300)})
  update.epa <- reactive({left_join(offense(), defense(), by = c("offense_play" = "defense_play"))})
  drives.table2 <- reactive({
    input$submit
    isolate({
      req(input$selections)
      new.drives_2019 <- subset(drives_2019, week %in% input$selections)})
  })
  games <- cfb_game_info(2019) %>% rename("game_id" = id)
  drives.off <- reactive({drives.table2() %>% left_join(games, by = c("game_id")) %>%
      mutate(
        adj_start_yardline = ifelse(offense == away_team, 100-start_yardline, start_yardline), 
        success = ifelse(drive_result %in% c("TD", "FG"), 1, 0),
        drive.pts = ifelse(drive_result == "TD", 6, ifelse(drive_result == "FG", 3, 0))) %>%
      group_by(offense) %>% 
      summarise(
        fp = mean(adj_start_yardline[adj_start_yardline > 10 & adj_start_yardline <40]), 
        srate = mean(success),
        drives = n(),
        drives.pts = sum(drive.pts))
  })
  drive.update.epa <- reactive({left_join(update.epa(), drives.off(), by=c("offense_play"="offense")) %>%
      mutate(pts.per.drive = drives.pts / drives)})
  cfb.table3 <- reactive({data.frame(drive.update.epa() %>% 
                                       select(offense_play, success.rate, epa.pass.off, epa.rush.off, epa.pass.def, epa.rush.def, fp, drives, pts.per.drive) %>% gt() %>%
                                       tab_header(title = "2019 Season"))})
  output$table = DT::renderDataTable({
    datatable(cfb.table3(),
              rownames = FALSE, 
              class = 'cell-border stripe',
              colnames = c('Team', 'Success Rate',
                           'Pass EPA', 'Run EPA',
                           'Pass EPA Def.',
                           'Run EPA Def.',
                           'Avg. Field Position',
                           'Drives',
                           'Points Per Drive'),
              list(pageLength = 25)) %>%
      formatPercentage(c('success.rate'),1) %>%
      formatRound(c('epa.pass.off'),3) %>%
      formatRound(c('epa.rush.off'),3) %>%
      formatRound(c('epa.pass.def'),3) %>%
      formatRound(c('epa.rush.def'),3) %>%
      formatRound(c('fp'),1) %>%
      formatRound(c('pts.per.drive'),3)
  })
}

app.R

library(tidyverse)
library(cfbscrapR)
library(gt)
library(dplyr)
library(ggplot2)
library(DT)
library(shiny)
library(shinythemes)
library(rsconnect)
library(logger)
library(shinyjs)

# load ui elements
source("ui.R")
# load server function
source("server.R")

# Run the application 
shinyApp(ui = ui, server = server)

For what it's worth, I am getting new messages in my Console: summarise() ungrouping output (override with .groups argument) summarise() ungrouping output (override with .groups argument) summarise() ungrouping output (override with .groups argument)

Thank you.

Edward Egros
  • 19
  • 1
  • 7
  • Hi Edward. Saying that the app is "no longer working" is not very useful for diagnosing the issue; what exactly is the error? For what it's worth, those `summarise` messages have been added in a recent version of dplyr and are unlikely to be breaking your app. – heds1 Jul 05 '20 at 07:13
  • The app works locally on my computer but doesn't on ShinyApps. I attempted traceback() and got the following: – Edward Egros Jul 05 '20 at 07:15
  • 16: execCallbacks(timeoutSecs, all, loop$id) 15: force(expr) 14: with_loop(loop, invisible(execCallbacks(timeoutSecs, all, loop$id))) 13: run_now(timeoutMs/1000, all = FALSE) 12: service(timeout) 11: serviceApp() – Edward Egros Jul 05 '20 at 07:15
  • Hi Edward, the warning is just a friendly warning message. By default, if there is any grouping before the summarise, it drops one group variable i.e. the last one specified in the group_by. you can use `options(dplyr.summarise.inform=F)` if you don't want them in your console. – rj-nirbhay Jul 05 '20 at 07:17
  • after your `summarise()` calls use `%>% ungroup()` prior to piping into your filter call. If your application is not working on ShinyApps, perhaps Shiny Server can't access your pbp_2019 and drives_2019 csv files which are stored locally in your current working directory. – hello_friend Jul 05 '20 at 07:18
  • Then I went to the log in shinyapps.io and all I could discern was: Warning: Error in force: object 'ui' not found Error in force(ui) : object 'ui' not found – Edward Egros Jul 05 '20 at 07:21
  • @A.Suliman The following objects are masked from ‘package:methods’: removeClass, show Warning: Error in force: object 'ui' not found66: force 65: uiHttpHandler: shinyApp Error in force(ui) : object 'ui' not found – Edward Egros Jul 05 '20 at 07:22
  • @EdwardEgros you don't need app.R if you have ui.R and server.R in the same folder. See here https://shiny.rstudio.com/articles/shinyapps.html and remove `ui<-` and `server<-` – A. Suliman Jul 05 '20 at 07:29
  • @A.Suliman Unfortunately after putting the shinyApp(ui = ui, server = server) command in server.R, it still did not work. I also checked both files at the time of publishing and they seem to be brought in just fine. – Edward Egros Jul 05 '20 at 08:28
  • @hello_friend I did need to update the csv files so thank you for that. However, I still cannot post to shinyapps. I did attempt the demo and that did work. – Edward Egros Jul 05 '20 at 18:18
  • @heds1 Did I answer your question sufficiently? – Edward Egros Jul 05 '20 at 18:22

1 Answers1

0

By combining files into an app.R instead of splitting up ui.R and server.R, the app was able to publish.

https://insidesportsanalytics.shinyapps.io/CollegeFootballScrapR/

Edward Egros
  • 19
  • 1
  • 7