1

フライト データを視覚化する R Shiny ツールを構築しています。航空機の緯度、経度、速度、機首方位、高度などを含む観測値を含むデータ テーブルを作成しました。次に、これらの観測値をリーフレットマップにプロットします。一連のスライダーとボックスを使用してこれらの観測をサブセット化し、目的の観測のみをプロットすることができます (たとえば、特定の高度の観測のみ)。複数の値を選択できるselectInput()ウィジェットを追加するまで、観測結果のレンダリングに問題はありませんでした。以下は、私のコードの最小限の再現可能な例です。

サーバー.R

library(shiny)
library(data.table)
library(leaflet)

shinyServer(function(input, output){

  # sample data set
  dt <- data.table(altitude = c(1,1,3,3,4,5,6,7,3,2),
                   long = c(-85.2753, -85.4364, -85.5358, -85.6644, -85.8208, 
                            -89.9233, -90.0456, -90.2775, -90.5800, -90.8761),
                   lat = c(45.3222, 45.3469, 45.3764, 45.4089, 45.4503,
                           44.0489, 44.1878, 44.3378, 44.4383, 44.5197),
                   origin = c('a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b'),
                   destination = c('c', 'c', 'c', 'c', 'c', 'd', 'd', 'd', 'd', 'd'))

  # subset the data on various inputs from ui.R
  subsetData <- reactive({
    new_data <- dt[altitude > input$alt_cut[1] &
                   altitude < input$alt_cut[2] &
                   origin %in% input$origin &
                   destination %in% input$dest, ]
    return(new_data)
  })

  # display the data in real time to identify if the subsetting
  # is occurring as expected.
  output$viewData <- renderTable({
    subsetData()
  })

  # plot the data points
  output$mapPlot <- renderLeaflet({
    leaflet() %>%
      fitBounds(-90.8761, 44.0489, -85.2753, 45.4503)
  })

  observe({
    leafletProxy('mapPlot') %>%
      clearGroup('A') %>%  # I think this line may not be functioning as I expect...
      addCircles(data = subsetData(),
                 group = 'A',
                 lng = ~long,
                 lat = ~lat,
                 radius = 2,
                 weight = 2)
  })
})

ui.R

shinyUI(fluidPage(
  titlePanel('Aircraft Flights'),
  sidebarLayout(
    sidebarPanel(
      sliderInput('alt_cut',
                  'Altitude range:',
                  min = 0,
                  max = 10,
                  value = c(0, 10),
                  step = 1),
      selectInput('origin',
                  'Filter on origin',
                  choices = c('a', 'b'),
                  selected = c('a', 'b'),
                  multiple = TRUE,
                  selectize = FALSE),
      selectInput('dest',
                  'Filter on destination',
                  choices = c('c', 'd'),
                  selected = c('c', 'd'),
                  multiple = TRUE,
                  selectize = FALSE)
    ),
    mainPanel(
      leafletOutput('mapPlot'),  # leaflet output for plotting the points
      tags$hr(),
      tableOutput('viewData')  # table for sanity check
    )
  )
))

出発地と目的地のいくつかの組み合わせをクリックすると、地図の下の表に正しく表示されているデータがプロットに反映されなくなります。たとえば、次の一連のアクションを試してください。

  1. アプリを実行する
  2. select origin: a (右上のシリーズが表示されます)
  3. select destination: d (a と d がリンクされていないため、プロットは空です)
  4. select destination: c (a と c がリンクされているため、右上のシリーズが再表示されます)
  5. select destination: d (右上の系列が間違って残る)

スライダーを使用した高度のサブセット化も機能しなくなりました。clearGroup('A')テーブルのデータは変化していますが、プロットは変化していないので、線が円を削除していないと思います。

表とプロットに表示される内容に相違があるのはなぜですか?

問題のスクリーンショット: テーブルにデータはありませんが、マップには点がプロットされています。

4

0 に答える 0