R:创建包含多个过滤器的路线图

时间:2017-06-18 02:51:09

标签: r shiny shinydashboard jvectormap rmaps

~~ EDIT ~~~

下面的答案有效,请查看我的代码是否完整,并为将来需要帮助的人提供问题解答。

~~~~~~~~

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

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

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

即您可以将SBU A与所有与SBU A关联的工厂关联并查看客户Y.然后您将看到与此相关的特定路线。

即。您可以将SBU B与Plant 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)

1 个答案:

答案 0 :(得分:0)

您需要制作数据集&#34;被动&#34;输入,然后继续使用和引用该反应数据集,以便每次输入更改时都会更新。

以下是根据Data变量的过滤版本制作名为reactive_dat <- reactive({ Data[Data$SBU == input$SBU, ] }) 的新反应变量的示例。

cell.l = { Target:"#'" + cell.v + "'!A1", Tooltip:cell.v }