Я строю интерактивную карту / панель инструментов в Shiny с большим количеством данных школьного округа.Цель состоит в том, чтобы создать боковую панель с различными условными панелями, и когда пользователь делает определенные выборы, слои будут отображаться на карте, а также, чтобы под картой появлялись поля значений с некоторой обобщенной статистикой.Если вы хотите попытаться воссоздать проблему с теми же данными, я работаю с этими двумя шейп-файлами (хотя в отдельном скрипте я объединил дополнительные данные и сохранил «школы» в виде столбцов csv с лат и lng, а не как shpфайл):
http://schoolsdata2 -tea-texas.opendata.arcgis.com / datasets / 059432fd0dcb4a208974c235e837c94f_0
schoolsdata2-tea-texas.opendata.arcgis.comнаборы данных / e115fed14c0f4ca5b942dc3323626b1c_0
Первый selectizeInput
предлагает 3 слоя: школьные округа, почтовый индекс, графства.После выбора слоя «Районы» всплывет условное выделение и список районов, из которых можно выбирать.Как только район выбран, появляется другая условная панель, предлагающая список кампусов в выбранном районе.
Чтобы предоставить опции для «Кампуса» selectizeInput
, у меня есть реактивная переменная school_choices
, которая вытягивает список уникальных названий Кампуса, перечисленных с выбранным районом.
Проблема, похоже, заключается в том, что при запуске приложения эта переменная запускается / запускается без какого-либо пользовательского ввода для района.Он также не обновляет selectizeInput
, когда выбран район.
Я пытался вложить реактивную переменную в ObserveEvent, а также в функцию Observe с оператором if, но, похоже, возникает та же проблема.
library(rgdal)
library(data.table)
library(readxl)
library(RPostgreSQL)
library(janitor)
library(rgeos)
library(here)
library(leaflet)
library(shiny)
library(shinyjs)
library(shinyWidgets)
library(shinyBS)
library(shinydashboard)
library(dplyr)
library(DT)
library(mapview)
library(png)
poly_options<- c("Independent School Districts", "Youth Crime Data by County", "Employment Data by Zip Code")
district_data <- readOGR(here("source_data/districts.shp"))
campus_data <- read.csv(here("source_data/schools.csv"))
district_options <- sort(district_data@data$NAME)
ui <- fluidPage(
useShinyjs(),
useShinydashboard(),
titlePanel("Awesome Title"),
sidebarLayout(
sidebarPanel(
selectizeInput(inputId = "polygons", label = "Display Info Rich layers:",
choices = c("Choose one " = "", as.character(poly_options)), multiple = TRUE),
conditionalPanel(condition = "output.districts",
selectizeInput(inputId = "schdist", label = "Choose a District:", choices = district_options,
multiple = FALSE, options = list(placeholder = 'Select one',
onInitialize = I('function() { this.setValue(""); }')))),
conditionalPanel(condition= "input.schdist", uiOutput("select_campus")),
)))
###
server <- function(input, output, session) {
school_choices <- reactive({
dist <- district_data[district_data@data$NAME == input$schdist, ]
choices <- campus_data[(campus_data$DISTNAME == dist$NAME), ]
choices <- choices$CAMPNAME
return(choices)
})
output$districts <- reactive({
if("Independent School Districts" %in% input$polygons) {
return(TRUE)
} else {
return(NULL)
}
})
outputOptions(output, "districts", suspendWhenHidden = FALSE)
output$select_campus <- renderUI({
selectizeInput("camp", "Choose a Campus:", choices = c("Choose one " = "", sort(school_choices())), selected = NULL)
})
}
Я написал в операторах печати, чтобы увидеть, когда срабатывает реактивная переменная.Я ожидаю, что приложение запустится и реактивная переменная будет иметь значение NULL, поскольку еще нет ввода, а затем, когда пользователь делает выбор, uiOutput
обновится.Но вместо этого произошло то, что при запуске переменная срабатывает, и когда должны быть выбраны NULL-районы (или только один за раз с выбором пользователя), вместо этого печатается, что выбор:
factor(0)
76 Levels: Aldine ISD Alief ISD Alvin ISD Anahuac ISD ... Willis ISD
За этим следует ошибка:
Warning: Error in Ops.factor: level sets of factors are different
121: stop
120: Ops.factor
117: <reactive:school_choices> [C:\User\Documents\GitHub\project/app.R#822]
, которая, я уверен, просто вызывает ошибку, потому что код не работает, когда пытаются выбрать более одного района.
Остальная часть приложения работает нормально, за исключением того, что, когда пользователь действительно выбирает район, «Кампус» selectizeInput
не обновляется и остается пустым.
Любые мысли относительнопочему эта переменная запускается без ввода пользователя?