Je suis un débutant en cartographie et j'essaie de créer une application brillante pour visualiser la satisfaction des étudiants et le classement des universités pour toutes les universités du Royaume-Uni.
À travers le dépliant, j'ai cartographié les emplacements universitaires avec des marqueurs et ajouté des curseurs avec des popups pour voir le score de satisfaction des étudiants et le classement (voir capture d'écran).
L'idée est de pouvoir choisir un ensemble de valeurs sur les curseurs (par exemple "Satisfaction de 80 à 90" et "Classement de 1 à 30" et l'application afficherait uniquement celles qui correspondent aux deux critères.
Le problème réside dans le fait d'avoir plusieurs réactifscurseurs. Si je code le curseur de classement de la même manière que le curseur de satisfaction, le curseur de satisfaction prend les valeurs de classement au lieu des deux curseurs fonctionnant indépendamment l'un de l'autre.
Ci-dessous, vous pouvez voir mon code jusqu'à présent avec une capture d'écran de son apparence ainsi que des données (les parties expérimentales du curseur Classement sont commentées afin qu'elles n'interfèrent pas).
Des astuces pour continuer afin que les deux curseurs ne se prennent pas de valeurs
Merci beaucoup et désolé si la question est très basique.
library(dplyr)
library(shiny)
library(leaflet)
mapData <- read.csv("~/Desktop/Shiny app/Csv Shiny Data Clean.csv") %>%
filter(!is.na(Latitude) & !is.na(Longitude))
ui <- bootstrapPage(
tags$style(type = "text/css", "html,
body {width:100%;height:100%}"),
leafletOutput("uniSmap", width = "100%", height = "100%"),
#slider for student satisfaction
absolutePanel(
top = 50,
right = 50,
sliderInput(
"range",
"Satisfaction Score",
min = 1,
max = 100,
value = round(range(mapData$Satisfaction.....2016.Registered, na.rm = TRUE), 1),
step = 1
)
),
#slider for Ranking
absolutePanel(
top = 200,
right = 50,
sliderInput(
"range",
"QS University Ranking",
min = 1,
max = 128,
value = round(range(mapData$QS.Ranking, na.rm = TRUE), 1),
step = 1
)
),
#bottom right title
absolutePanel(
bottom = 10,
left = 10,
"Satisfaction Map 2016"
)
)
server <- function(input, output, session) {
filteredData <- reactive({
mapData %>%
filter(Satisfaction.....2016.Registered >= input$range[1] &
Satisfaction.....2016.Registered <= input$range[2])
})
#question here: can I just do the same for Ranking Data (as below)?
# filteredDataRanking <- reactive({
# mapData %>%
# filter(QS.Ranking >= input$range[1] &
# QS.Ranking <= input$range[2])
# })
output$uniSmap <- renderLeaflet({
# as the map is only drawn once
# use non-reactive dataframe, mapData
leaflet(mapData) %>%
addTiles() %>%
fitBounds(~min(Longitude), ~min(Latitude),
~max(Longitude), ~max(Latitude))
})
# Incremental changes to the map performed in an observer.
observe({
leafletProxy("uniSmap", data = filteredData()) %>%
clearShapes() %>%
clearPopups() %>%
clearMarkers() %>%
addMarkers(lat = ~Latitude,
lng = ~Longitude,
popup = ~paste(
Institution,
"<br>",
"Overall Satisfaction:",
Satisfaction.....2016.Registered,
"<br>"
)
)
}) #end of observe for satisfaction
#would I have to create another observe for ranking data (as below)?
# observe({
#
# leafletProxy("uniSmap", data = filteredDataRanking()) %>%
#
# clearShapes() %>%
# clearPopups() %>%
# clearMarkers() %>%
#
# addMarkers(lat = ~Latitude,
# lng = ~Longitude,
# popup = ~paste(
# Institution,
# "<br>",
# "QS University Ranking",
# QS.Ranking,
# "<br>"
# )
# )
#
# }) #end of observe for Ranking
} #end of server description
shinyApp(ui = ui, server = server)
#License: thanks to Stephen McDaniel, from whom a substantial portion of this code is Copyright by ((c) 2017 Stephen McDaniel)
Capture d'écran de l'application
Lien vers les données utilisées
Réponses:
0 pour la réponse № 1Après avoir renommé chaque curseur satisfaction
et ranking
vous devez utiliser les deux plages dans le même filtre pour que toutes les conditions soient appliquées:
filteredData <- reactive({
mapData %>%
filter(Satisfaction.....2016.Registered >= input$satisfaction[1] &
Satisfaction.....2016.Registered <= input$satisfaction[2]) &
QS.Ranking >= input$ranking[1] &
QS.Ranking <= input$ranking[2])
})