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, ]
})
~~编辑~~~
下面的答案有效,请查看我的代码以完成并为将来需要帮助的任何人回答问题。
~~~~~~~~
我正在尝试在 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, ]
})