web-dev-qa-db-ja.com

光沢のあるアプリをデプロイするときにデータオブジェクトが見つかりません

私は最初の光沢のあるアプリに取り組んでおり、データテーブルのレンダリングに使用されるデータがshinyapps.ioによって取得されないという問題が発生しています。

アプリはコンソールで正常に実行されますが、デプロイすると、ブラウザで次のエラーが表示されます。オブジェクト「ピッチャー」が見つかりません。「ピッチャー」はデータオブジェクトの1つです。

1つの提案 アプリのフォルダー内のフォルダーにデータを配置すると言われていますが、それでも機能しません。

これが私の現在のserver.Rコードです:

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

})

そしてここにui.Rコードがあります:

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 (i.e. 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/") 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   )
                 )
)
)
)

WindowsPCから展開しています。

何か提案をいただければ幸いです!

更新

Colinのアドバイスを受けてコードを更新しましたが、まだ同じ問題が発生しています。

デプロイしたときのアプリの外観は次のとおりです。

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

そして、ローカルまたはWebで公開および表示すると、次のようになります。

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

オブジェクトが欠落しているだけでなく、アプリの残りの部分を見ることができます。アプリ全体が消えるだけです。

これが私の更新されたコードです:

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 (i.e. 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/") 
      )
    )))))
8
BillPetti

ああ! ui.Rスクリプトの一部としてピッチャーファイルをロードしていないのではないかと思います。したがって、年の入力を定義しているときは、Pitchers $ yearを見つけることができません。 shinyUI()呼び出しの上にあるuiスクリプトのピッチャーファイルを読んでみてください。

光沢のあるデータの取り込みに関するいくつかの事項:データが定期的に変更されない場合は、データの取り込みを反応させる必要はありません。 shinyServer()呼び出しの前にサーバーファイルの最初に配置するだけです。コードのその部分は、アプリをデプロイするときに1回だけ実行されるため、ユーザーに依存しないlibrary()呼び出し、データインジェスト、または前処理を行うのに適した場所です。仕方。通常のRの場合と同じようにread.csv()を使用できます。また、read.csvが少し遅くなる可能性があるため、データフレームのbinayを保存するとよい場合もあります。

それが変更される場合(更新されたcsvが定期的にファイルに入れられるように)、read.csv()呼び出しをshinyServer()呼び出しの下に置きますが、これも必要ではありません。反応性。

お役に立てば幸いです。

6
Shorpy

RenderDataTable関数の内部に入ると、関数の外部で定義されているため、Pitchersが何であるかを認識しません。ただし、ピッチャーをリアクティブ要素に設定すると、関数内で呼び出すことができます。したがって、変数を設定してから、レンダリング関数内の関数として呼び出します。

Pitchers<- reactive({read.csv("Your Stuff")})

output$table1 <- renderDataTable(
Pitch<-Pitchers()

"Then call all your if statements and such on the function using Pitch"
)

お役に立てば幸いです。

1
Colin Robinson

前の答えに便乗:

問題は、オブジェクト「Pitchers」をshinyServerとshinyUIの両方で定義する必要があることであることに同意します。 「global.R」と呼ばれる3番目のファイルを作成することは、この問題を解決するための最良の方法かもしれません。これは、データベースを1回読み取るだけでよいためです(これは、無料のshinyapps.ioサーバーよりも高速で優れています)。グローバルスコープで変数を作成する方法の詳細については、 https://shiny.rstudio.com/articles/scoping.html を参照してください。

0
Christian