R:创建具有多个过滤器的路线图

R: creating a route map with multiple filters

~~编辑~~~

下面的答案有效,请查看我的代码以完成并为将来需要帮助的任何人回答问题。

~~~~~~~~

我正在尝试在 R 中创建一个仪表板(第一个!),它将创建一个地图,显示包裹初始位置和包裹结束位置(环游世界)之间的数千条路线。然后我想要过滤器以便根据条件显示不同的路线(如果可能的话,给出一个框来告诉根据选择有多少条路线)。

我能够用所有线条制作仪表板和地图,看起来很棒。现在的问题是我似乎无法弄清楚如何创建交互式过滤器。我的问题是我目前正在创建线条并将它们绘制在 For 循环中,因此它们不会保存在任何地方。

我有三个过滤器:部门(我称之为 SBU)、制造工厂(我称之为工厂,是 SBU 的子集)和客户。

即您可以拥有 SBU A 以及与 SBU A 关联的所有工厂,然后查看客户 Y。然后您将看到与此关联的那些特定路线。

即您可以将 SBU B 与工厂 K 并查看所有客户

很遗憾,我无法给出原始数据。

任何帮助将不胜感激,因为我是 R 的新手!

    library(shiny)
    library(shinydashboard)
    library(maps)
    library(geosphere)
    library(maps)
    library(mapproj)
    library(geosphere)
    library(ggrepel)
    library(scales)

    ###########################/ui.R/##################################
    #Setting drive where files are located
    setwd("C:/R Files")

    #Pulling in outside Data Files
    Network <- read.csv("Network Codes.csv")
    Data <- read.csv("Raw Data2.csv")

    #Header
    header <- dashboardHeader(
      title = "Intake Routes")

    #SideBar
    sidebar <- dashboardSidebar(

      #SBU Selection List
      selectInput(inputId = "SBU", "SBU:", selected="ALL",
                  choices = unique(as.character(Network$SBU))),

      #Plant Selection List
      uiOutput("Plant"),

      #Customer Selection List
      selectInput(inputId = "Customer", "Customer:", multiple = TRUE, selected="ALL",
          choices = unique(as.character(Data$Customer.Name.Standard))))

    #Body
    body <- dashboardBody(
      plotOutput(outputId = "map")
    )

    #Builds Dashboard Page
    ui <- dashboardPage(header, sidebar, body)

    ###########################/server.R/###############################
    server <- function(input, output) {

    ##INPUT##  
      #Dependant Plant SideBar List Dependant on SBU
      output$Plant <- renderUI({
        selectInput(inputId = "Plant", "Plant:", multiple = TRUE,
            choices = as.character(Network[Network$SBU == input$SBU, "Plant.Name"]))
      })

      #Reactive data set based on inputs
      Reactive_Data1 <- reactive({
        if (input$SBU == "ALL") {Data}
        else {Data[Data$SBU == input$SBU,]}
      })

      Reactive_Data2 <- reactive({
        if (input$Plant == "ALL") {Reactive_Data1()}
        else {Reactive_Data1()[Reactive_Data1()$Plant == (input$Plant),]}
      })

     Reactive_Data3 <- reactive({
       if (input$Customer == "ALL") {Reactive_Data2()}
       else {Reactive_Data2()[Reactive_Data2()$Customer.Name.Standard == input$Customer,]}
      })

    output$map <- renderPlot({

      #Map coordinates
      xlim <- c(-170,170)
      ylim <- c(-55,75)

      map("world", col="#f2f2f2", fill=TRUE, bg="white", lwd=0.05, xlim=xlim, ylim=ylim)

      npoints <- 20
      nroutes <- nrow(Data)

      for(i in 1:nroutes){

        inter <- gcIntermediate(c(Data$Ship.From.Longitude[i],
                          Data$Ship.From.Latitude[i]),
                        c(Data$Ship.To.Longitude[i],
                          Data$Ship.To.Latitude[i]),
                        n=npoints, addStartEnd = T, breakAtDateLine = T)

        if (is.list(inter)) {
          inter1 <- inter[[1]]
          inter2 <- inter[[2]]
          lines(inter1, col = "green", lwd=0.50)
          lines(inter2, col = "blue", lwd=0.50)}
        else {
          lines(inter, col = "grey", lwd=0.50)}
      }
      })
    }

    #Combines Dashboard and Data together
    shinyApp(ui, server)

您需要将数据集 "reactive" 作为您的输入,然后继续使用和引用该反应性数据集,以便每次您的输入更改时它都会更新。

下面是一个基于 Data 变量的过滤版本创建名为 reactive_dat 的新反应变量的示例。

reactive_dat <- reactive({
  Data[Data$SBU == input$SBU, ]
})