В Shinyapps.io не работает блестящее приложение (ошибка: объектный интерфейс не найден) - PullRequest
1 голос
/ 20 марта 2020

Я успешно запустил следующее блестящее приложение локально. К сожалению, когда я запускаю его в shinyapps.io, я получаю следующее сообщение об ошибке из своего журнала: Ошибка в силе (ui): объект 'ui' не найден. Даже после обширной трассировки я не смог найти ничего, что указывало бы на то, почему пользовательский интерфейс не был найден, и снова он мог работать локально.

Вот полный журнал:


tidyverse_conflicts() ── ✖ dplyr::filter() masks stats::filter() ✖ dplyr::lag() masks stats::lag() 

Warning: replacing previous import ‘mgcv::multinom’ by ‘nnet::multinom’ when loading ‘cfbscrapR’ 

The following objects are masked from ‘package:shiny’: dataTableOutput, renderDataTable 

The following object is masked from ‘package:shiny’: serverInfo Attaching package: ‘rsconnect’ 

64: shinyApp Warning: Error in force: object 'ui' not found –

Здесь мой код для ui.R:

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

###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)

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)
  })
}

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

1 Ответ

0 голосов
/ 20 марта 2020

https://shiny.rstudio.com/articles/two-file.html ссылается на двухфайловое блестящее приложение. До версии 0.10.2 это было требование. С этой страницы (а также https://shiny.rstudio.com/articles/app-formats.html):

Для приложений, определенных таким образом, файл server.R должен возвращать функцию server, и файл ui.R должен возвращать объект пользовательского интерфейса (в этом случае объект пользовательского интерфейса создается fluidPage()). Другими словами, если файлы содержали другой код (например, служебные функции), вы должны убедиться, что последнее выражение в файле является серверной функцией или объектом пользовательского интерфейса.

В частности, «содержащий другой код» включает в себя окончание server.R с shinyApp(ui = ui, server = server), которое не «возвращает» объект сервера.

Таким образом, здесь есть три неправильные вещи:

  • Файл server.R должен заканчиваться объектом server, либо его определение является последним в этом файле, либо вы должны добавить server в качестве последней строки кода в этот файл.

  • Поскольку вы используете двухфайловую систему, вам не нужно использовать shinyApp(ui, server).

  • Однако, поскольку вы это сделали, объект ui не определен или недоступен в server.R. (На самом деле, я не знаю, можете ли вы смело предположить, что порядок файлов source d, поэтому один взлом может быть source("ui.R") в server.R, но я не думаю, что это то, что вам нужно.

Возможные решения:

  1. Объедините эти два в один файл, возможно, настройку app.R, которая является ссылками во второй ссылке выше. оставьте вызов shinyApp(ui, server).

  2. Сохраните файлы как есть и удалите вызов на shinyApp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...