R: создание карты маршрутов с несколькими фильтрами

~~EDIT~~~

Ответ ниже сработал, пожалуйста, посмотрите мой код, чтобы быть полным и ответ на вопрос для тех, кто нуждается в помощи в будущем.

~~~~~~~~

Я пытаюсь создать панель управления в R (первая!), Которая создаст карту, на которой будут показаны тысячи маршрутов между начальным местоположением пакета и конечным местоположением пакета (путешествуя по всему миру). Затем я хотел бы иметь фильтры, чтобы показать разные маршруты на основе критериев (и, если возможно, дать поле, чтобы указать, сколько маршрутов существует на основе выбора).

Я смог сделать приборную панель и карту со всеми линиями, и это выглядит великолепно. Проблема сейчас в том, что я не могу понять, как создать фильтры для интерактивности. Моя проблема в том, что я сейчас создаю линии и строю их в цикле, чтобы они нигде не сохранялись.

У меня есть три фильтра: отдел (который я называю 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)

1 ответ

Решение

Вам нужно сделать набор данных "реагирующим" на ваши входы, а затем продолжать использовать и ссылаться на этот реактивный набор данных, чтобы он обновлялся при каждом изменении ваших входных данных.

Вот пример создания новой реактивной переменной под названием reactive_dat на основе отфильтрованной версии вашего Data переменная.

reactive_dat <- reactive({
  Data[Data$SBU == input$SBU, ]
})
Другие вопросы по тегам