Реактивная переменная срабатывает слишком рано (при запуске приложения) в Shiny Dashboard - PullRequest
1 голос
/ 24 марта 2019

Я строю интерактивную карту / панель инструментов в 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 не обновляется и остается пустым.

Любые мысли относительнопочему эта переменная запускается без ввода пользователя?

1 Ответ

0 голосов
/ 25 марта 2019

Ваш пример не воспроизводим, потому что нет кода, который загружает ваши данные (скорее всего, за пределами пользовательского интерфейса и серверной части). Тем не менее, я думаю, что одна проблема заключается в том, что нет кода, который обновляет входной объект выбора. «renderUI» имеет элементы пользовательского интерфейса, которые обычно отображаются при выполнении определенных условий; код в вашем примере не имеет условий.

Попробуйте что-то похожее на приведенное ниже вместо функции renderUI:

    updateSelectInput(session, "camp",
                      choices = schoolchoices(),
                      selected = input$camp)

Также, если обновления на вашей карте все еще происходят слишком быстро, рассмотрите возможность использования функции isolate () в реактивном выражении school_choices. Вы можете даже изолировать все реактивы, кроме кнопки действия.

# From https://shiny.rstudio.com/articles/isolation.html
# The plot render function changes only when the "goButton" button changes, rather than every time the input slider "obs" changes

server <- function(input, output) {
  output$distPlot <- renderPlot({

    # Take a dependency on input$goButton
    input$goButton

    # Use isolate() to avoid dependency on input$obs
    dist <- isolate(rnorm(input$obs))
    hist(dist)
  })
}
...