Data object not found when deploying brilliant application

I am working on my first brilliant application and run into a problem when the data that is used to display my data table is not collected by shinyapps.io.

The application works fine in my console, but when I deploy it, the application opens in a browser with an error: the Jugs object was not found, where the Pittsers is one of my data objects.

I found one suggestion that says about placing your data in a folder in the application folder, but that still doesn't work.

Here is my current server.R code:

shinyServer(function(input, output) { Pitchers <- read.csv("data/Pitchers_Edge.csv", header=TRUE, check.names = FALSE) Batters <- read.csv("data/Batters_Edge.csv", header=TRUE, check.names = FALSE) output$table1 <- renderDataTable({ if (input$Year != "All"){ Pitchers <- Pitchers[Pitchers$Year == input$Year,] } Pitchers }) output$table2 <- renderDataTable({ if (input$Year != "All"){ Batters <- Batters[Batters$Year == input$Year,] } Batters }) }) 

And here is the ui.R code:

 shinyUI(fluidPage( titlePanel('Edge%: 2010-Present'), fluidRow( column(12, p("Provides current and historical data on the percentage of pitches thrown to different parts of the strike zone by pitchers and to batters"), p("Created and maintained by Bill Petti", a("(@BillPetti)", href = "https://twitter.com/billpetti")), p("Data last updated",Sys.time())) ), fluidRow( column(5, selectInput("Year", "Year:", c("All", unique(as.character(Pitchers$Year))))) ), mainPanel( tabsetPanel( tabPanel("Pitchers", dataTableOutput(outputId = 'table1')), tabPanel("Batters", dataTableOutput(outputId = 'table2')), tabPanel("About", br(), h1("About Edge%"), br(), p("A few years ago, Jeff Zimmerman and I created a metric to represent how often a pitcher threw to the edges of the strike zone compared to the heart of the strike zone. The result was Edge%. The metric has evolved to include separate metrics for different edges (upper, lower, etc.). In the image below, the brown shaded areas represent the horizontal edges of the strike zone, the blue the top, and the green the bottom edges. You will notice the horizontal edges differ by batter handedness, given how umpires actually call balls and strikes."), br(), img( src = "edge_image.png", height = 350, width = 700)), br(), p("Edge% is useful in a number of contexts. For example, we know that as pitchers age they lose velocity and therefore need to avoid throwing to the heart of the plate to be successful. Edge% provides a quick look at who is adjusting to lower velocity and who isn't. It can also be used to see how pitchers are adjusting to hitters as they age (ie as hitters improve, pitchers may avoid the heart of the plate more, or as hitters decline they may begin challenge them more."), br(), p("For more information on Edge%, check out these articles:", br(), br(), a("Introduction to Edge%", href = "http://www.fangraphs.com/blogs/the-difference-pitching-on-the-edge-makes/"), br(), br(), a("Collection of Articles Using and Expanding on Edge%", href = "http://www.fangraphs.com/blogs/category/edge/"), br(), br(), a("Most Recent Version", href = "http://www.hardballtimes.com/expanding-the-edges-of-the-strike-zone/") ) ) ) ) ) 

I am deploying from a Windows PC.

Would thank for any suggestions!

Update

I took Colin's advice and updated my code, but I am still facing the same problem.

Here's what my application looks like when deployed:

http://i.stack.imgur.com/idmvC.jpg

And this is what happens when I publish and browse locally or on the Internet:

http://i.stack.imgur.com/ikBrD.jpg

It's not just that the object is missing, but I can see the rest of the application. The whole application just disappears.

Here is my updated code:

 library(shiny) shinyServer(function(input, output) { Pitchers <- reactive({read.csv("data/Pitchers_Edge.csv", header=TRUE, check.names = FALSE)}) Batters <- reactive({read.csv("data/Batters_Edge.csv", header=TRUE, check.names = FALSE)}) output$table1 <- renderDataTable({ Pitchers <- Pitchers() if (input$Year != "All"){ Pitchers <- Pitchers[Pitchers$Year == input$Year,] } subset(Pitchers, Pitchers$'# of total pitches'>= input$pitch_total) }) output$table2 <- renderDataTable({ Batters <- Batters() if (input$Year != "All"){ Batters <- Batters[Batters$Year == input$Year,] } subset(Batters, Batters$'# of total pitches'>= input$pitch_total) }) }) shinyUI(fluidPage( titlePanel('Edge%: 2010-Present'), fluidRow( column(12, p("Provides current and historical data on the percentage of pitches thrown to different parts of the strike zone by pitchers and to batters"), p("Created and maintained by Bill Petti", a("(@BillPetti)", href = "https://twitter.com/billpetti")), p("Data last updated",Sys.time())) ), sidebarLayout( sidebarPanel(selectInput("Year", "Year:", c("All", unique(as.character(Pitchers$Year)))), numericInput("pitch_total", label = "Minimum # of Pitches:", value = 300) ) , mainPanel( tabsetPanel( tabPanel("Pitchers", dataTableOutput(outputId = 'table1')), tabPanel("Batters", dataTableOutput(outputId = 'table2')), tabPanel("About", br(), h1("About Edge%"), br(), p("A few years ago, Jeff Zimmerman and I created a metric to represent how often a pitcher threw to the edges of the strike zone compared to the heart of the strike zone. The result was Edge%. The metric has evolved to include separate metrics for different edges (upper, lower, etc.). In the image below, the brown shaded areas represent the horizontal edges of the strike zone, the blue the top, and the green the bottom edges. You will notice the horizontal edges differ by batter handedness, given how umpires actually call balls and strikes."), br(), img( src = "edge_image.png", height = 350, width = 700), br(), p("Edge% is useful in a number of contexts. For example, we know that as pitchers age they lose velocity and therefore need to avoid throwing to the heart of the plate to be successful. Edge% provides a quick look at who is adjusting to lower velocity and who isn't. It can also be used to see how pitchers are adjusting to hitters as they age (ie as hitters improve, pitchers may avoid the heart of the plate more, or as hitters decline they may begin challenge them more."), br(), p("For more information on Edge%, check out these articles:"), br(), a("Introduction to Edge%", href = "http://www.fangraphs.com/blogs/the-difference-pitching-on-the-edge-makes/"), br(), br(), a("Collection of Articles Using and Expanding on Edge%", href = "http://www.fangraphs.com/blogs/category/edge/"), br(), br(), a("Most Recent Version", href = "http://www.hardballtimes.com/expanding-the-edges-of-the-strike-zone/") ) ))))) 
+6
source share
3 answers

ABOUT! I think you are not loading the pitchers file as part of the ui.R script. Therefore, when you determine the entry of the year, it cannot find the Pitchers $ year. Can you try to read the jugs file in a ui script above calling shinyUI() ?

Some data on the dangers of data is brilliant: if your data does not change regularly, you do not need your data to be susceptible to reactivity. Just put it at the very beginning of the server file before calling shinyServer() . This part of the code is run only once when you deploy the application, so that it is convenient to make any library() calls, malicious data or preprocessing files that are completely independent of the user. You can just use read.csv() in the same way as in regular R, sometimes it is also useful to save the binary in a dataframe, because read.csv can be a little slow.

If it changes (for example, the updated csv will be placed in the file regularly), then place the read.csv() call below the shinyServer() call, but you don’t need to respond again.

Hope this helps!

+6
source

Once you get inside the renderDataTable function, it will not know what Pitchers are because it was defined outside the function. However, if you set Pitchers as a reactive element, you can call it inside the function. So to set a variable and then call it as a function inside the render function.

 Pitchers<- reactive({read.csv("Your Stuff")}) output$table1 <- renderDataTable( Pitch<-Pitchers() "Then call all your if statements and such on the function using Pitch" ) 

Hope this helps!

+1
source

Getting a response to the previous answer:

I agree that the problem is that the Jugs object needs to be defined in both shinyServer and shinyUI. Creating a third file named "global.R" may be the best way to solve this problem, since you only need to read the database once (which is faster and more enjoyable for the free shinyapps.io server). See https://shiny.rstudio.com/articles/scoping.html for more information on creating variables with a global scope.

0
source

Source: https://habr.com/ru/post/986292/


All Articles